Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Nue eine CheckBox wird gefunden ! (https://www.delphipraxis.net/187264-nue-eine-checkbox-wird-gefunden.html)

Minibike 12. Nov 2015 15:14


Nue eine CheckBox wird gefunden !
 
Hallo,
habe seit Tagen ein Problem mit den CheckBoxen, und komme nicht mehr weiter. Wahrscheinlich ein kleines Problem, aber ich hab mir Delphi selbs angeeignet, und habe somit wenig Erfahrung und Ahnung von Delphi. Zum Problem : hab 10 CheckBoxen Dynamisch erzeugt, und kann nur eine davon abfragen, wieso ?

// 10 CheckBoxen erzeugen (0-9)
h := 64; // Höhe
i:=0;
While i <=9 Do Begin
newCheckBox := TCheckBox.Create(newCheckBox);
newCheckBox.parent := newtab;
newCheckBox.name := 'NewCheckBox'+inttostr(k)+inttostr(i);
newCheckBox.caption := 'Neue CheckBox'+inttostr(k)+inttostr(i);
newCheckBox.width := 120;
newCheckBox.left := 80;
newCheckBox.top := h;
newCheckBox.visible := true;
h := h +24;
i:=i+1;
end;



// Die 10 CheckBoxen abfragen
i:=0;
While i<=9 Do
begin
Test := 'NewCheckBox7' + IntToStr(i);
If TCheckBox(FindComponent(Test)).Checked = true then
ShowMessage('Ergebnis : True')
ELSE
ShowMessage('Ergebnis : False') ;
i:=i+1;
end;


Erster Durchlauf (i=0) wird NewCheckBox70 eindeutig gefunden, aber bei der nächsten (i=1) NewCheckBox71 bricht das Prg. zusammen, wieso ?

Gruß Mike, ich hoffe Ihr könnt mir da weiter helfen.........

mkinzler 12. Nov 2015 15:20

AW: Nue eine CheckBox wird gefunden !
 
Das Interessanteste hast Du weggelassen: Wie fragst Du ab?

Delphi-Quellcode:
newCheckBox := TCheckBox.Create(newCheckBox);
ist auch etwas ungünstig. Nimm besser die Form oder newTab als Owner oder Nil.

Minibike 12. Nov 2015 16:13

AW: Nue eine CheckBox wird gefunden !
 
Hallo,
danke für die schnelle Antwort, aber alles was ich Versuche geht nicht, habs mit newTab und Nil versucht.
Ich versuche die ganze Zeit 10 CheckBoxen auf ein TabSheet zu erzeugen. Das Neue TabSheet hab ich so erzeugt:
Delphi-Quellcode:
  //
  k := PageControl1.PageCount + 1;
  newtab := TTabSheet.Create(PageControl1);
  newtab.PageControl := PageControl1;
  newtab.name := 'tab'+inttostr(k);
  newtab.Caption := 'Tab '+inttostr(k);
  //
Danach 2x Label mit Text
  //
  newlabel := TLabel.Create(newlabel);
  newlabel.name := 'tablabel1'+inttostr(k);
  newlabel.caption := 'Bitte Aktivieren Sie die Felder die im Listfenster angezeigt werden sollen.';
  newlabel.Left   := 48;
  newlabel.Top    := 384;
  newlabel.visible := true;
  newlabel.parent := newtab;
  //
Danach diese CheckBoxen
  //
  h := 64; i:=0;
  While i <=9 Do Begin
    newCheckBox := TCheckBox.Create(newCheckBox);
    newCheckBox.parent := newtab;
    newCheckBox.name   := 'NewCheckBox'+inttostr(k)+inttostr(i);
    newCheckBox.caption := 'Neue CheckBox'+inttostr(k)+inttostr(i);
    newCheckBox.width  := 120;
    newCheckBox.left   := 80;
    newCheckBox.top    := h;
    newCheckBox.visible := true;
    h := h +24; i:=i+1;
  end;
  //



jetzt die Abfrage dazu

  i:=0;
  While i<=9 Do
  begin
    Test := 'NewCheckBox7' + IntToStr(i);
    If TCheckBox(FindComponent(Test)).Checked = true then
      ShowMessage('Ergebnis : True')
    ELSE
      ShowMessage('Ergebnis : False') ;
    i:=i+1;
  end;

Müsste doch eigentlich Funktionieren.
Geht ja auch, aber nur die erste CheckBox, bei den nächsten gibts einen abbruch.

Sir Rufo 12. Nov 2015 16:25

AW: Nue eine CheckBox wird gefunden !
 
Es wäre sehr freundlich, wenn du deinen Delphi-Quellcode mit den Delphi-Tags umschließen würdest, dann sieht der Quelltext gleich lesbarer aus.

Aus
Code:
[DELPHI]
procedure foo;
begin
  DoBar();
end;
[/DELPHI]
wird
Delphi-Quellcode:
procedure foo;
begin
  DoBar();
end;

Mavarik 12. Nov 2015 16:28

AW: Nue eine CheckBox wird gefunden !
 
Du hast die Checkboxen doch selber erzeugt? Warum willst Du die dann suchen?

Sir Rufo 12. Nov 2015 16:34

AW: Nue eine CheckBox wird gefunden !
 
Zum eigentlichen Thema:

Die Dokumentation zu
Delphi-Quellcode:
TComponent.FindComponent
sagt
Zitat:

Gibt an, ob der Komponente eine bestimmte Komponente untergeordnet ist.

FindComponent gibt diejenige Komponente im Array Components zurück, deren Name mit dem String im Parameter AName übereinstimmt. Mit Hilfe von FindComponent können Sie feststellen, ob eine bestimmte Komponente einer anderen Komponente untergeordnet ist.

Bie den Komponentennamen wird die Groß-/Kleinschreibung nicht berücksichtigt.
Du fragst (ich vermute mal) die Form, ob es dort so einen Komponente gibt. Die Form ist aber gar nicht der Besitzer (Owner) der gesuchten Komponente und darum kannst du die so auch nicht finden.

Häng deine Komponenten an einen
Delphi-Quellcode:
Owner
und dann frage diesen
Delphi-Quellcode:
Owner
nach den gesuchten Komponenten ab.

Alternativ kannst du aber auch rekursiv durch alle beteiligten Komponenten durchsuchen, was aber auch nur dann funktioniert, wenn die gesuchten Komponenten einen
Delphi-Quellcode:
Owner
haben.

Weitere ALternative ist das suchen über die
Delphi-Quellcode:
Parent
-Beziehung abfragen mit
Delphi-Quellcode:
TWinControl.FindChildControl

Sir Rufo 12. Nov 2015 16:36

AW: Nue eine CheckBox wird gefunden !
 
Zitat:

Zitat von Mavarik (Beitrag 1321340)
Du hast die Checkboxen doch selber erzeugt? Warum willst Du die dann suchen?

Da diese Erzeugung zur Laufzeit insgesamt sehr statisch aussieht, würde sich sogar die Verwendung von einem Frame anbieten. Dann wird nur das Frame zur Laufzeit erzeugt und dort ist alles enthalten. :stupid:

hoika 12. Nov 2015 16:54

AW: Nue eine CheckBox wird gefunden !
 
Hallo,
probier doch ma Kommentare aus ...

Delphi-Quellcode:
newCheckBox := TCheckBox.Create(newCheckBox); ist auch etwas ungünstig. Nimm besser die Form oder newTab als Owner oder Nil.

Markus Kinzler

Delphi-Quellcode:
newCheckBox := TCheckBox.Create(Self);


Und fertig.

Heiko

Mavarik 12. Nov 2015 16:57

AW: Nue eine CheckBox wird gefunden !
 
Danach diese Checkboxen
Delphi-Quellcode:
  var ListederCheckBoxen = TList<TCheckBox>;
begin
  //
  ListederCheckBoxen = TList<TCheckBox>.Create;
  h := 64; i:=0;
  While i <=9 Do Begin
    newCheckBox := TCheckBox.Create(newCheckBox);
    ListederCheckBoxen.Add(NewCheckBox);
    newCheckBox.parent := newtab;
    newCheckBox.name   := 'NewCheckBox'+inttostr(k)+inttostr(i);
    newCheckBox.caption := 'Neue CheckBox'+inttostr(k)+inttostr(i);
    newCheckBox.width  := 120;
    newCheckBox.left   := 80;
    newCheckBox.top    := h;
    newCheckBox.visible := true;
    h := h +24; i:=i+1;
  end;
  //
end;
jetzt die Abfrage dazu

Delphi-Quellcode:
  i:=0;
  While i<=9 Do
  begin
    If ListederCheckBoxen.Items[I].Checked = true then
      ShowMessage('Ergebnis : True')
    ELSE
      ShowMessage('Ergebnis : False') ;
    i:=i+1;
  end;

ListederCheckBoxen.Free; //
Fertig.

mkinzler 12. Nov 2015 17:05

AW: Nue eine CheckBox wird gefunden !
 
Aber das auch gleich beheben:

Delphi-Quellcode:
newCheckBox := TCheckBox.Create(self);
Delphi-Quellcode:
If ListederCheckBoxen.Items[I].Checked then

Captnemo 12. Nov 2015 18:15

AW: Nue eine CheckBox wird gefunden !
 
Man könnte das ganze natürlich auch in ein Array packen:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    MyCheckBoxes: array [0..9] of TCheckBox;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  I: Integer;
begin
  mmo1.Lines.Clear;
  for I := 0 to 9 do
    if MyCheckBoxes[i].Checked then
      mmo1.Lines.Add(Format('Checkbox %d ist checked', [i])) else
      mmo1.Lines.Add(Format('Checkbox %d ist nicht checked', [i]));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to 9 do
  begin
    MyCheckBoxes[i]:=TCheckBox.Create(self);
    with MyCheckBoxes[i] do
    begin
      Parent:=self;
      Name:='Checkbox'+IntToStr(i);
      Caption:='CheckBox '+IntToStr(i);
      Left:=80;
      Width:=120;
      Top:=64 + (i * 24);
      Visible:=True;
    end;
  end;
end;

end.
Möglicherweise bietet sich für sowas auch eine CheckListBox an.

Sir Rufo 12. Nov 2015 18:56

AW: Nue eine CheckBox wird gefunden !
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oder eben ohne dieses Zusammengebaue (s. Anhang Source + EXE zum Herumspielen)

Minibike 12. Nov 2015 19:27

AW: Nue eine CheckBox wird gefunden !
 
@Sir Rufu
Danke für die vielen Antworten, ich hoffe Du kannst mir noch öfter Helfen, und sorry , dass ich nicht wußte, wie man den Source anständig Postet,
aber jetzt weiß ich es ja.

@hoika
Deine Antwort : newCheckBox := TCheckBox.Create(Self);
Und fertig.
Du hast mich in Grund und Boden versenkt, Tagelang zerbrach ich mir den Kopf, unzählige Versionen Probiert, immer wieder bekamm ich von
Delphi eine Ohrfeige. Und jetzt siehe da, es können alle Checkboxen abgefragt werden, NUR DURCH EIN WORT >>> SELF <<<< warum auch immer, es geht.

Wie gesagt, ich hab mir Delphi selbst beigebracht, und verstehe deshalb nicht alles, und bin froh, das es dieses Forum gibt, Danke nochmal an alle.........
Und jetzt ab in die Nachtschicht von 22.00Uhr - 6.00Uhr.

Gruß Mike

Perlsau 12. Nov 2015 20:52

AW: Nue eine CheckBox wird gefunden !
 
Zitat:

Zitat von Minibike (Beitrag 1321359)
NUR DURCH EIN WORT >>> SELF <<<< warum auch immer, es geht.

Das ist eigentlich ganz einfach zu verstehen: Wenn du ein visuelles Objekt erstellst, muß der Compiler (bzw. das compilierte Programm) ja wissen, wo er das hinmalen soll – auf dein Formular oder auf ein Panel, das sich auf deinem Formular befindet oder wo sonst auch immer. Self ist die Variable, die das Formular bezeichnet. Wenn du also beim Create-Befehl Self als Owner (= Eigentümer) angibst, weiß der Compiler, daß das Objekt auf dem Formular gezeichnet werden soll. Die Eigenschaften Left und Top beziehen sich dann auf das Formular. Gibst du z.B. MeinPanel als Owner an, wird das Objekt auf dem Panel gezeichnet, das den Namen MeinPanel hat. Beim Suchen nach einem visuellen Objekt muß der Compiler ebenfalls wissen, wo er denn überhaupt suchen soll: Ist das ein Objekt der Form oder ein Objekt auf dem Panel oder gehört es zu irgend einer anderen visuellen Komponente?

Create ist der Konstruktor, der ein Objekt erzeugt. Verschiedene Objekte verfügen über unterschiedliche Konstruktoren. So muß z.B. nicht bei jedem Create der Owner angegeben werden, das beschränkt sich auf visuelle Objekte. Andere Objekte wie z.B. TStringList verlangen gar keine Angabe im Create-Befehl, wieder andere wie z.B. TFileStream erwarten einen Dateinamen und den Stream-Modus als Parameter im Create-Befehl.

Übrigens hab ich mir Delphi auch selbst beigebracht und kann ebenfalls kein Informatikstudium vorweisen. Soweit mir bekannt lernen auch Informatiker nicht wirklich eine Programmiersprache in ihren Vorlesungen, sondern müssen sich diese Kenntnisse ebenfalls selber beibringen. Man sollte sich da nicht "künstlich" selbst herabsetzen, nur weil man nicht studiert hat, denn das Verständnis für eine Programmiersprache verlangt zuallererst einmal eine gewisse Affinität zum Programmieren, und die wirst du wohl haben, sonst würdest du das gar nicht erst betreiben.

Als Einstieg und zum Erwerben von Basis-Kenntnissen und Erlernen der Objekt-Orientierung hat sich das Ebook vom Delphi-Treff bewährt.

Sir Rufo 12. Nov 2015 21:23

AW: Nue eine CheckBox wird gefunden !
 
Das mit dem
Delphi-Quellcode:
Self
lässt sehr leicht aufklären, wenn man weiß, dass Delphi in Methoden dieses
Delphi-Quellcode:
Self
in den Scope nimmt und dieses hier
Delphi-Quellcode:
If TCheckBox(FindComponent(Test)).Checked = true then
      ShowMessage('Ergebnis : True')
    ELSE
      ShowMessage('Ergebnis : False') ;
intern so
Delphi-Quellcode:
If TCheckBox( Self.FindComponent( Test ) ).Checked = true then
      ShowMessage('Ergebnis : True')
    ELSE
      ShowMessage('Ergebnis : False') ;
abgearbeitet wird ;)

Jetzt sollte man auch die Information aus der Dokumentation geistig zusammenführen können.

BadenPower 14. Nov 2015 17:30

AW: Nue eine CheckBox wird gefunden !
 
Zitat:

Zitat von Perlsau (Beitrag 1321364)
Self ist die Variable, die das Formular bezeichnet. Wenn du also beim Create-Befehl Self als Owner (= Eigentümer) angibst, weiß der Compiler, daß das Objekt auf dem Formular gezeichnet werden soll. Die Eigenschaften Left und Top beziehen sich dann auf das Formular. Gibst du z.B. MeinPanel als Owner an, wird das Objekt auf dem Panel gezeichnet, das den Namen MeinPanel hat.

Dass eine Komponente auf ihrem Owner gezeichnet wird, darauf würde ich mich nicht verlassen und würde es auch so niemals ausdrücken, denn gezeichnet wird die Komponente auf dem Parent und nicht auf dem Owner.

Natürlich können Owner und Parent gleich sein, aber eben nicht zwingend.

hoika 14. Nov 2015 19:26

AW: Nue eine CheckBox wird gefunden !
 
Hallo,
dann noch viel Erfolg beim Delphi-Lernen!
Solche Schüler haben wir hier gern:)

LG
Heiko

Perlsau 14. Nov 2015 19:27

AW: Nue eine CheckBox wird gefunden !
 
Wo du recht hast ... :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 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