![]() |
StringGrid in einem Frame suchen
Hallo schon wieder,
ich habe ein Formular, auf dem befindet sich ein PageControl. Auf jeder Seite des PageControls befinden sich Frames. Ich möchte jetzt vom Formular aus ein StringGrid finden, welches sich in einem Frame befindet. Dazu dachte ich, dass ich erst einmal prüfe, welche Seite von dem PageControl activ ist, und dort das Frame finde. Danach wollte ich in diesem Frame nach dem StringGrid suchen.
Delphi-Quellcode:
Das klappt so aber nicht, denn
var Frame: TFrame;
SG: TAdvStringGrid; I: integer; begin for I := 0 to FrameControl.ActivePage.ComponentCount -1 do begin if Components[I] is TFrame then begin Frame:= Components[I] as TFrame; end; end; for I := 0 to Frame.ComponentCount -1 do begin if Components[I] is TAdvStringGrid then begin SG:= Components[I] as TAdvStringGrid; end; end;
Delphi-Quellcode:
ergibt eine Anzahlt von Componenten von -1.
FrameControl.ActivePage.ComponentCount -1
Hat jemand eine Idee, wie ich das realisieren kann? Vielen Dank Patrick |
AW: StringGrid in einem Frame suchen
Das Formular wird nicht Eigentümer der Frames sein.
|
AW: StringGrid in einem Frame suchen
.Components sind nur die Komponenten mit dem Owner (über welchen man sucht)
das Selbe gilt für FindComponent In .Controls sind alle Komponenten wo es der Parent ist. Du wirst wohl das durchsuchen müssen und wenn sich der Grid/Frame in dinem Panel (usw.) befindet, dann wirst du die .Controls rekursiv durchsuchen müssen. Wenn du die Form im FormDesigner zusammengeklickt hast, dann ist immer die Form/Frame der Owner von allen draufgeklickten Komponenten. :angel: Und ich empfehle dir mal auf deinen Compiler zu hören, welche da ganz laut was von nichtinitialisierten Variablen rumschreit. |
AW: StringGrid in einem Frame suchen
Liste der Anhänge anzeigen (Anzahl: 1)
Die Struktur sieht so aus: Bild.
@himitsu: Das Programm ist mittlerweile etwas größer geworden, aber ich kann in den Warnungen des Compilers keinen Hinweis zu einem der 14 Frames finden. Aber wie kann ich das herausfinden und wie kann ich das ändern? Danke Patrick |
AW: StringGrid in einem Frame suchen
Wie gesagt, die Form ist der Ownder, also sind die Frames nur in .Components der Form enthalten.
Frame Suchen: Du mußt somit in TabScheet.Controls suchen. Oder du suchst in Form.Components nach dem Frame mit Frame.Parent=FrameControl.ActivePage . In Frame.Components sind dann alle Komponenten (auch das Grid), welche irgendwo auf den Frame draufgelegt wurden. In Frame.Controls sind nur die Komponenten, welche "direkt" auf dem Frame liegen.
Delphi-Quellcode:
var Frame: TFrame;
SG: TAdvStringGrid; I: integer; begin for I := 0 to FrameControl.ActivePage.ComponentCount -1 do begin if Components[I] is TFrame then begin Frame:= Components[I] as TFrame; // wenn For und If nichts treffen, dann ist "Frame" nichts zugewiesen end; end; for I := 0 to Frame.ComponentCount -1 do begin // -> Warnung "Frame" if Components[I] is TAdvStringGrid then begin SG:= Components[I] as TAdvStringGrid; end; end; // irgendwas mit SG -> Warnung "SG" |
AW: StringGrid in einem Frame suchen
Hallo himitsu,
Delphi-Quellcode:
war der Hinweis, den ich brauchte... So funktioniert es jetzt:
Frame.Parent=FrameControl.ActivePage
Delphi-Quellcode:
Vielen Dank
var Frame: TFrame;
SG: TAdvStringGrid; I: integer; begin for I := 0 to Main.ComponentCount -1 do begin if Components[I] is TFrame then begin if Components[i].GetParentComponent=FrameControl.ActivePage then begin Frame:= Components[I] as TFrame; end; end; end; if Frame=nil then begin Showmessage('Das entsprechende Frame konnte nicht gefunden werden'); Exit; end; for I := 0 to Frame.ComponentCount -1 do begin if Frame.Components[I] is TAdvStringGrid then begin SG:= Frame.Components[I] as TAdvStringGrid; end; end; if SG=nil then begin Showmessage('Das entsprechende StringGrid konnte nicht gefunden werden'); Exit; end; Patrick |
AW: StringGrid in einem Frame suchen
Delphi-Quellcode:
Wie gesagt, man sollte dringend auf den Compiler hören.
var Frame: TFrame; // lokale Variablem werden nicht automatisch initialisiert (1), also zu 99,99999% steht das, statistisch gesehen, nicht auf NIL
SG: TAdvStringGrid; I: integer; begin for I := 0 to Main.ComponentCount -1 do begin if Components[I] is TFrame then begin if Components[i].GetParentComponent=FrameControl.ActivePage then begin Frame:= Components[I] as TFrame; end; end; end; if Frame=nil then begin // Wenn kein Frame gefunden wurde, trifft somit diese Prüfung womöglich nicht das gewollte Ergebnis. ...
Delphi-Quellcode:
ist formal richtig, aber persönlich finde ich
if SG=nil then
Delphi-Quellcode:
leserlicher.
if Assigned(SG) then
Und es Assigned ist vorallem bei Methodenzeigern schöner, da Diese intern eigentlich aus zwei Pointern bestehen. (1) Mit kleinen Ausnahmen, welche allerdings nur automatisch verwaltete Typen betrifft, wie z.B. Strings, Interfaces und dynamische Arrays. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 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