Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ableitung von TWinControl um SendMessage zu nutzen (https://www.delphipraxis.net/169893-ableitung-von-twincontrol-um-sendmessage-zu-nutzen.html)

Cyberaxx 19. Aug 2012 22:12

Ableitung von TWinControl um SendMessage zu nutzen
 
Hallo,

bin gerade dabei eine Klasse zu erstellen die von TWinControl abgeleitet ist.
Es soll eine Erweiterung eines Stringgrids sein aber keine Ableitung dessen sondern nur auf ihm aufbauen.

Delphi-Quellcode:
type
  TGridManager = class(TWinControl)
  private
  public
    constructor Create(AGrid: TAdvStringGrid)
end;
Dau gibt es eine Klasse die sich um den Header dest Stringgrids kümmert.

Delphi-Quellcode:
  TColHeader = class(TObject)
  private
    FGridHandle: Cardinal;
    FList: TList;
    FGrid: TAdvStringGrid;
    procedure ClearList();
  public
    constructor Create(Grid: TAdvStringGrid; Handle: Cardinal);
    destructor Destroy(); override;
    procedure Add(Name: string; ACol, ARow: Integer); overload;
    procedure Add(Name: string; ACol, ARow, SpanCol, SpanRow: Integer); overload;
  end;
Anfangs war der GridManager nur abgeleitet vom TObject. Da musste ich aber feststellen das innerhalb diesen Blocks

Delphi-Quellcode:
procedure TColHeader.Add(Name: string; ACol, ARow, SpanCol, SpanRow: Integer);
  var
    ColObj: TColObj;
begin
  ColObj := TColObj.Create;
  ColObj.Name := Name;
  ColObj.Col := ACol;
  ColObj.Row := ARow;
  ColObj.ColSpan := SpanCol;
  ColObj.RowSpan := SpanRow;

  FList.Add(ColObj);

  FGrid.MergeCells(ACol, ARow, SpanCol, SpanRow);
  FGrid.Cells[ACol, ARow] := Name;
end;
es nicht funktioniert den ColCount zu setzen, wenn die Anzahl der Cols größer ist als die voreingestellten.

Nun habe ich es abgeleitet vom TWinControl und wollte es dementsprechend mit SendMessage ausstatten aber ich erhalte da im Create des ColHeaders die Fehlermeldung:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EInvalidOperation mit der Meldung 'Element '' hat kein übergeordnetes Fenster' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Was mache ich hier falsch? Bzw. wie bekomme ich meine Klasse dazu Messages zu emfangen?

Hoffe hier kann mich jemand helfen.

Gruß
Cyber

himitsu 19. Aug 2012 23:15

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
Irgendwie fehlen hier alle wichtigen Infos.

z.B.:
Zitat:

Zitat von Cyberaxx (Beitrag 1178814)
Da musste ich aber feststellen das innerhalb diesen Blocks
...
es nicht funktioniert den ColCount zu setzen,

ColCount kann ich hier nirgends finden.


Zitat:

Zitat von Cyberaxx (Beitrag 1178814)
Was mache ich hier falsch? Bzw. wie bekomme ich meine Klasse dazu Messages zu emfangen?

Indem du deiner Klasse auch eine MessageWindow, bzw. ein Control (HWND) gibts, welches die Massage empfängt
und/oder wenn du deinem Objekt einen Parent gibst, welcher Messages ersatzweise empfangen/verarbeiten kann.

TWinControl ist nur en Container für ein Windows-Control. (MSDN-Library durchsuchenCreateWindow)
Genauso wie ein Delphi-Referenz durchsuchenTHandleStream nichts ohne ein Handle ist.

Cyberaxx 20. Aug 2012 06:11

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
Bei dem StringGrid handelt es sich um das AdvStringGrid von TMS.

Diese nutzen ColCount und RowCount. Habs eben noch einmal nachgesehen.

Das mit dem Parent könnte ich ja dann meine Form nehmen oder würde auch das AdvStringGrid gehen?

Zitat:

Zitat von himitsu (Beitrag 1178818)
Indem du deiner Klasse auch eine MessageWindow, bzw. ein Control (HWND) gibts, welches die Massage empfängt

Könntest Du mir das vielleicht näher erklären was für Möglichkeiten ich habe ohne eben z.B. die Form zu nutzen?

Gruß
Cyber

Cyberaxx 20. Aug 2012 07:01

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
OK das mit den Messages klappt. Doch leider ist das mit dem Problem noch nicht behoben.

Schreibs zwar mal hier rein wird aber dann wohl noch nen neues Thema werden.

Im standard ist das AdvStringGrid belegt mit ColCount := 5, jetzt würde ich gerne zur Laufzeit die ColCount ändern wenn menie Cols größer sind als die Anzahl der vorhandenen.
Daher auch die Idee mit den Messages. Wenn ich die ColCount änder dann habe ich plötzlich nur noch eine Col und alle Rows sind Fixed Rows. Dachte dies könnte ich mittels einer Message umgehen aber scheinbar doch nen Bug in der Komponente?

[Edit] Erledigt... Hatte noch eine andere Klasse die mit mein ColCount zunichte gemacht hat...

sx2008 20. Aug 2012 08:24

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
Was ist ein WinControl?
Ein WinControl ist eine visuelle Komponente, die ein Control aus einer Windows DLL (windows common controls, Comctl32.dll) kapselt und dazu insbesondere ein Handle speichert.
WinControls können Tastaturevents und Mausevents empfangen sowie den Focus erhalten.
Im Gegensatz dazu können TGraphicControls (wie z.B. TSpeedButton) nicht den Focus erhalten und keine Tastaturmessages bekommen.

Jetzt schau mal deine Klasse TGridManager genau an.
Es ist eine Managerklasse, die ein externes, bestehende TAdvStringGrid-Objekt benützt.
Deine Klasse ist kein WinControl, sondern etwas anderes.
Du kannst dir sicher vorstellen, dass wenn du von einer falschen Basisklasse ableitest der Code immer irgendwie falsch sein wird.

Cyberaxx 20. Aug 2012 09:38

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
Na es klappt ja nun. Hab einfach das Formular genommen, nicht schön aber es funktioniert erst einmal :)

himitsu 20. Aug 2012 09:53

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
Eher etwas unpraktisch, denn (falls ich mich jetzt nicht täuche) ist das TWinControl der Owner seines Handles und es darf nur einen Owner geben.

Die Lösung wäre ein eigenes "MessageOnlyWindow" für dieses WinControl. (so wie z.B. auch der Timer in sich eine eigene Fenster erstellt, worüber es seine Timer-Messages behandelt)

Cyberaxx 20. Aug 2012 10:14

AW: Ableitung von TWinControl um SendMessage zu nutzen
 
OK begriffen und umgesetzt. Habs mir vom TTimer geklaut. Hatte da noch einen Thread gefunden aber das war mir zu viel zum verstehen gerade. Da macht es der TTimer schon relativ einfach :)

Ich bedanke mich.

Gruß
Cyber


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz