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/)
-   -   Delphi Button Captions in array (https://www.delphipraxis.net/110061-button-captions-array.html)

seim 12. Mär 2008 11:47


Button Captions in array
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
gibt es eine Möglichkeit die Captions von Buttons per for Schleife auszulesen?
Also ich habe hier 64 Buttons und von denen müsste ich alle die Captions 'X' oder kein X '' in ein array speichern.
Also im Prinzip steht die Variable der for Schleife jetzt im Variablen Name:
for i:=1 to 64 ....
Buttoni.Caption ...

Kann man das irgendwie lösen oder darf ich jetzt ein paar mal 64 Zeilen schreiben?

Muetze1 12. Mär 2008 11:48

Re: Button Captions in array
 
Schau dir mal Delphi-Referenz durchsuchenFindComponent() an, aber eigentlich würde ich dir eher empfehlen die Buttons einem Array zu zu weisen und vllt. auch noch zusätzlich dynamisch zu erzeugen.

mkinzler 12. Mär 2008 11:50

Re: Button Captions in array
 
Such mal nach FindComponent()

RavenIV 12. Mär 2008 12:39

Re: Button Captions in array
 
Zitat:

Zitat von mkinzler
Such mal nach FindComponent()

Der Kinzler ist RAUS.

:lol: :lol:

SirThornberry 12. Mär 2008 12:51

Re: Button Captions in array
 
was spricht dagegen die Buttons gleich in ein Array zu stopfen? :)
Und anstelle von FindComponent würde ich dann doch lieber gleich mit ControlCount alle controls durchlaufen. Denn sonst wird intern im schlimmsten Fall ellex n mal durchlaufen.

RavenIV 12. Mär 2008 12:55

Re: Button Captions in array
 
Zitat:

Zitat von seim
Also ich habe hier 64 Buttons und von denen müsste ich alle die Captions 'X' oder kein X '' in ein array speichern.

Ich würde keine Buttons, sondern CheckBoxen nehmen.
Und die dann in einem zweidimensionalen Array verwalten.

Dann kannst Du die so abfragen:
Delphi-Quellcode:
if TCheckBox(BoxArray[1][5]).Checked then

Muetze1 12. Mär 2008 12:59

Re: Button Captions in array
 
Und das Array mit dem Typ TCheckbox anlegen, dann wird die Abfrage nochmal kürzer... :zwinker:

Nein, die Goldwaage steht im Schrank, die habe ich nicht rausgeholt...

RavenIV 12. Mär 2008 13:01

Re: Button Captions in array
 
Zitat:

Zitat von Muetze1
Und das Array mit dem Typ TCheckbox anlegen, dann wird die Abfrage nochmal kürzer... :zwinker:

Nein, die Goldwaage steht im Schrank, die habe ich nicht rausgeholt...

Das habe ich mal vorausgesetzt.
Aber trotzdem zur Sicherheit casten.

Muetze1 12. Mär 2008 13:03

Re: Button Captions in array
 
Zitat:

Zitat von RavenIV
Aber trotzdem zur Sicherheit casten.

:gruebel: Das verstehe ich nun nicht. Ein harter Typecast bringt doch keine Sicherheiten eher viel mehr Unsicherheiten. Wenn du dies wegen Sicherheit machst, dann nutze den AS Operator. Oder wie meintest du das?

RavenIV 12. Mär 2008 13:13

Re: Button Captions in array
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von RavenIV
Aber trotzdem zur Sicherheit casten.

:gruebel: Das verstehe ich nun nicht. Ein harter Typecast bringt doch keine Sicherheiten eher viel mehr Unsicherheiten. Wenn du dies wegen Sicherheit machst, dann nutze den AS Operator. Oder wie meintest du das?

In der Regel verwende ich keine Arrays, sondern Listen.
Da es aber mit einer zweidimensionalen Liste etwas schwierig wird, halt ein Array.
Und bei Listen MUSS man casten, weil nur Zeiger abgelegt werden.
Also mach ich das bei Arrays eben auch.

Meine Meinung zum abc AS xyz:
Das ist Geschmacksache, ob ist nun das dynamische Bindung (AS) oder Casting (xyz(abc)) verwende.

Oder kann mir jemand verständlich erklären, wann man dynamische Bindung oder Casting verwendet und warum?

Muetze1 12. Mär 2008 13:30

Re: Button Captions in array
 
Zitat:

Zitat von RavenIV
Und bei Listen MUSS man casten, weil nur Zeiger abgelegt werden.
Also mach ich das bei Arrays eben auch.

Es wird bei beiden Formen nur Pointer abgelegt und verwaltet. Aber bei einem Array wird die Typensicherheit von Delphi direkt auf den spezialisierten Typ angewendet. Bei einer TObjectList wird nur spezifisch mit dem Basistyp TObject gearbeitet.

Zitat:

Zitat von RavenIV
Meine Meinung zum abc AS xyz:
Das ist Geschmacksache, ob ist nun das dynamische Bindung (AS) oder Casting (xyz(abc)) verwende.

Oder kann mir jemand verständlich erklären, wann man dynamische Bindung oder Casting verwendet und warum?

AS macht intern eine IS Prüfung und würde fehlschlagen, wenn das Elemente NIL ist oder einen falschen Typ hat. Sprich: Button OnClick Handler. Ein dynamischer Cast mit AS auf ein TMemo würde mit einer entsprechenden Exception quittiert werden und somit der (falsche) Zugriff auf eine Eigenschaft unterbunden. Bei einem harten Typecast wird nichts überprüft sondern du sagst dem Compiler: mach dir keine Gedanken, interpretiere den Speicher dort bitte so... Damit würde bei einem Zugriff auf eine Eigenschaft von TMemo(Sender) auf den Offset in TButton zugreifen wo bei TMemo entsprechend diese Eigenschaft liegen würde. Somit: Du greifst auf den Speicher zu interpretierst die dort vorhandenen Bytes einfach wie es dir genehm wäre. So würde ein Zugriff auf TMemo(Sender).Lines nicht die TStrings Instanz ermitteln (die TButton nicht hat) sondern (Beispiel) das Modalresult des Buttons liefern, da es an der Stelle liegt (zufälliger weise). Und der ModalResult Eigenschaftswert wird dann als TStrings Instanz interpretiert werden. Wenn du dann davon eine Methode aufrufst, dann springt er in die Methode und landet sonstwo im Speicher - wo wahrscheinlich nichtmal Code steht bzw. der Speicher gehört nicht zur Anwendung oder ist vllt. nichtmal ein Codesegment sondern was anderes.

Naja, grundlegend sollte es klar sein. Von daher ist ein solcher harter Typecast nur zu nutzen, wenn man sich 100%ig sicher sein kann, das der Typ eindeutig ist (bzw. eigentlich 110%ig, damit im Fehlerfall nicht noch mehr Fehler dadurch erzeugt werden). Ich habe es in meinem Beispiel zuvor bei den Actions mit einer Assertion abgeprüft. Dort hätte man auch alternativ einmalig mit IS fragen können um dann (bei Erfolg) mit einem harten Typecast zu arbeiten, um sich dort dann die erneute Typprüfung bei den Zugriffen zu ersparen...

inherited 12. Mär 2008 13:36

Re: Button Captions in array
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von mkinzler
Such mal nach FindComponent()

Der Kinzler ist RAUS.

:lol: :lol:

Warum DAS denn?

(Sorry für Total-OT, aber alle Fans der alten Switch-Folgen werden das verstehen :mrgreen: )

RavenIV 12. Mär 2008 13:59

Re: Button Captions in array
 
Zitat:

Zitat von inherited
Zitat:

Zitat von RavenIV
Zitat:

Zitat von mkinzler
Such mal nach FindComponent()

Der Kinzler ist RAUS.

:lol: :lol:

Warum DAS denn?

(Sorry für Total-OT, aber alle Fans der alten Switch-Folgen werden das verstehen :mrgreen: )

Weil zu langsam. :)

seim 12. Mär 2008 15:25

Re: Button Captions in array
 
Also ich hab mir jetzt mal den Vorschlag mit den Checkboxen angeguckt, das ist zwar optisch nicht ganz so berauschend, allerdings geht das für's erste einfacher.

Jetzt habe ich nur noch ein paar kleine Prob's damit. Also ich definiere das Array mit den Checkboxen und sage dann testweise einem Button das der die Boxen createn soll:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  BoxArray: array[1..3,1..3] of TCheckBox;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//Mach was
BoxArray[1][1].Create(Form1);
end;

end.
Dabei stürzt das Prog. aber nur ab, also ich hab da noch nicht soviel Plan von Sachen zur Laufzeit erstellen^^

RavenIV 12. Mär 2008 15:31

Re: Button Captions in array
 
Versuch es mal so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
//Mach was
BoxArray[1][1] := TCheckBox.Create(Self);
end;
Um alle CheckBoxen erzeugen zu lassen, kannst Du eine doppelte for-Schleife nehmen.

DeddyH 12. Mär 2008 15:31

Re: Button Captions in array
 
Delphi-Quellcode:
BoxArray[1][1] := TCheckBox.Create(Form1);
[edit] 2 late :? [/edit]

Aurelius 12. Mär 2008 15:32

Re: Button Captions in array
 
Etwas zur Laufzeit zu erstellen ist recht einfach. Wir machen mal ein Beispiel anhand eines Labels.

Als erstes musst du den Button deklarieren, z.B. im Private-Bereich der Form.
Delphi-Quellcode:
private
  TestLabel : TLabel;
jetzt musst du das Teil nur noch erstellen und die Werte, die du sonst im Objectinspektor eingibts, selbst definieren
Delphi-Quellcode:
procedure TForm.ErstelleLabel;
begin
  TestLabel := TLabel.Create(self);
  TestLabel.Caption := 'testlabel';
  Testlabel.Top := 100;
  Testlabel.Width := 100;
  ...
end;
Du darfst aber nicht vergessen das Label dann wieder freizugeben, z.B. im OnClose der Form.
Delphi-Quellcode:
procedure TForm.OnClose();
begin
  testlabel.free;
end;
(keine Garantie auf Funktionalität, aus dem Kopf getippt)

RavenIV 12. Mär 2008 15:38

Re: Button Captions in array
 
Zitat:

Zitat von xX0815Xx
Etwas zur Laufzeit zu erstellen ist recht einfach. Wir machen mal ein Beispiel anhand eines Labels.

Als erstes musst du den Button deklarieren, z.B. im Private-Bereich der Form.

Schnipp - Schnapp

Die Variable wird aber in diesem speziellen Fall nicht benötigt.
Man kann das frisch erzeugte Objekt auch direkt in das Array "schieben".

Freigeben sollte man die Objekte aber schon wieder.
Dies setze ich als Selbstverständlichkeit voraus...

seim 12. Mär 2008 15:43

Re: Button Captions in array
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok vielen Dank an alle,
ich glaub ich hab das Prinzip nu verstanden wie man Objekte in ein Array legt, hier nochmal das Ergebnis:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  BoxArray: array[1..3,1..3] of TCheckBox;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
begin
//Mach was
for i:= 1 to 3 do
  for j:= 1 to 3 do begin
    BoxArray[i][j]:= TCheckBox.Create(Self);
    BoxArray[i][j].Parent:= Form1;

    BoxArray[i][j].Top:= i * 17;
    BoxArray[i][j].Left:= j * 17;
  end;


end;

end.
Den Screen davon gibts als Attachment.

RavenIV 12. Mär 2008 15:54

Re: Button Captions in array
 
Und wenn Du jetzt anstelle von TCheckBox noch eine schöne andere CheckBox (z.B. bei torry.net suchen) verwendest, dann wird's richtig gut.

Die andere CheckBox könnte z.B. nicht den "Haken", sondern ein "Kreuz" anzeigen, wenn sie aktiviert ist.
Schön wäre auch noch, wenn man die Grösse anpassen könnte.

Muetze1 12. Mär 2008 16:14

Re: Button Captions in array
 
Nur mal so als Alternative mit nur einer Schleife:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i:= 0 to 8 do
  begin
    BoxArray[succ(i div 3)][succ(i mod 3)]:= TCheckBox.Create(Self);
    BoxArray[succ(i div 3)][succ(i mod 3)].Parent:= Form1;

    BoxArray[succ(i div 3)][succ(i mod 3)].Top := succ(i div 3) * 17;
    BoxArray[succ(i div 3)][succ(i mod 3)].Left := succ(i mod 3) * 17;
  end;
end;
Nur zur Vielfalt des Codes publiziert...


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