Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringGrid in einem Frame suchen (https://www.delphipraxis.net/182937-stringgrid-einem-frame-suchen.html)

Ykcim 27. Nov 2014 16:39

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:
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;
Das klappt so aber nicht, denn
Delphi-Quellcode:
FrameControl.ActivePage.ComponentCount -1
ergibt eine Anzahlt von Componenten von -1.

Hat jemand eine Idee, wie ich das realisieren kann?

Vielen Dank
Patrick

mkinzler 27. Nov 2014 16:42

AW: StringGrid in einem Frame suchen
 
Das Formular wird nicht Eigentümer der Frames sein.

himitsu 27. Nov 2014 16:53

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.

Ykcim 27. Nov 2014 16:54

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

himitsu 27. Nov 2014 17:34

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"

Ykcim 28. Nov 2014 09:23

AW: StringGrid in einem Frame suchen
 
Hallo himitsu,

Delphi-Quellcode:
Frame.Parent=FrameControl.ActivePage
war der Hinweis, den ich brauchte... So funktioniert es jetzt:
Delphi-Quellcode:
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;
Vielen Dank
Patrick

himitsu 28. Nov 2014 09:34

AW: StringGrid in einem Frame suchen
 
Delphi-Quellcode:
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.
     ...
Wie gesagt, man sollte dringend auf den Compiler hören.

Delphi-Quellcode:
if SG=nil then
ist formal richtig, aber persönlich finde ich
Delphi-Quellcode:
if Assigned(SG) then
leserlicher.
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 06:32 Uhr.

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