Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Steuerelementearray (https://www.delphipraxis.net/11701-steuerelementearray.html)

mirko2000 12. Nov 2003 09:48


Steuerelementearray
 
Hallo!

Ich beginne gerade mit Delphi-Programmierung in Borland Delphi 7. Also bitte alles Schritt für Schritt erklären!

Ich will das Spiel TicTacToe mit Steuerelementen-Arrays programmieren. Wie erstelle ich ein Steuerelementearray? :wall:

Vielen Dank im Voraus!

:duck:

Tyrael Y. 12. Nov 2003 09:51

Re: Steuerelementearray
 
Kommt drauf an was du vor hast...

..

zB. array of TObject

oder array of TComponent

oder

....

Sharky 12. Nov 2003 09:55

Re: Steuerelementearray
 
Hai mirko2000,

ersteinmal "Herzlich Willkommen in der Delphi-PRAXIS".

Was genau verstehst Du denn unter einem "Steuerelementearray"?

mirko2000 12. Nov 2003 10:06

Re: Steuerelementearray
 
Zitat:

Zitat von Sharky
Hai mirko2000,

ersteinmal "Herzlich Willkommen in der Delphi-PRAXIS".

Was genau verstehst Du denn unter einem "Steuerelementearray"?

Ich kenne ein Steuerlementearray aus Visual Basic 6. Dort kann dann in einer Schleife mit dem Schleifenzähler (z. B. von 0 bis 8) die verschiedenen Steuerelemente z. B. mit cmdLos(i), wobei i der Schleifenzähler von 0 bis 8 ist, irgendwelche Eigenschaften auslesen oder verändern.

Mit meinem Kenntnisstand von Delphi müsste ich diese 9 mal selber schreiben.

mirko2000 12. Nov 2003 10:08

Re: Steuerelementearray
 
Zitat:

Zitat von Tyrael Y.
Kommt drauf an was du vor hast...

..

zB. array of TObject

oder array of TComponent

oder

....

TObject :gruebel:
Tcomponent :gruebel:

Tyrael Y. 12. Nov 2003 10:15

Re: Steuerelementearray
 
Zitat:

Zitat von mirko2000
Zitat:

Zitat von Tyrael Y.
Kommt drauf an was du vor hast...

..

zB. array of TObject

oder array of TComponent

oder

....

TObject :gruebel:
Tcomponent :gruebel:


TObject = Basisklasse für alle Objekte
TComponent = Basisklasse für Komponenten


hier mal die Hierarchie der Klassen

TObject -> TPersistent -> TComponent .....

es kommt drauf an welche Steuerelemente du nutzen möchtest

mirko2000 12. Nov 2003 10:18

Re: Steuerelementearray
 
Zitat:

Zitat von Tyrael Y.
TObject = Basisklasse für alle Objekte
TComponent = Basisklasse für Komponenten


hier mal die Hierarchie der Klassen

TObject -> TPersistent -> TComponent .....

es kommt drauf an welche Steuerelemente du nutzen möchtest

Ich möchte das Steuerelement TButton benutzen!

Sanchez 12. Nov 2003 10:19

Re: Steuerelementearray
 
Dann nimm array of TButton

Tyrael Y. 12. Nov 2003 10:22

Re: Steuerelementearray
 
Mir fällt da ein,

... du kannst ruhig array of TObject nutzen,
weil in ein array von Objekten wird eh immer nur 4Byte pro Feld gespeichert,
in jedem Feld steht dann die Adresse des Objektes

du kannst deshalb auch

array of pointer nutzen

z.B.:

Array delarieren:
Delphi-Quellcode:
einArray:array of pointer


Delphi-Quellcode:

var meinObjekt:TMeineKlasse;
begin
....
 for i := 0 to max do
 begin
    meinObjekt := TMeineKlasse.Create;
    einArray[i] := meinObjekt;
 end;
....
end;
mach es ruhig mit array of pointer.
da ist es egal welches steuerelment du in das array schreibst,
da eh nur ein pointer drin steht

gruß

choose 12. Nov 2003 10:30

Re: Steuerelementearray
 
Zitat:

Zitat von Tyrael Y.
[...]du kannst ruhig array of TObject nutzen, weil in ein array von Objekten wird eh immer nur 4Byte pro Feld gespeichert, in jedem Feld steht dann die Adresse des Objektes [...] du kannst deshalb auch array of pointer nutzen

Hallo Tyrael Y., hallo mirko2000

das Thema Casting und die Gefahren wurden in diesem Thread eingehend besprochen.

Tyrael Y. 12. Nov 2003 10:35

Re: Steuerelementearray
 
naja muss jeder selbst wissen wie er das machen möchte,
ich mach das mit dem Typcast und gebe auch den Speicher selbst wieder frei
mann muß halt wissen was man da macht

gruß
tyrael

Tyrael Y. 12. Nov 2003 10:53

Re: Steuerelementearray
 
wegn der übersichtlichkeit empfehle ich dir aber
in diesem Fall doch array of TButton zu nutzen

mirko2000 12. Nov 2003 12:56

Re: Steuerelementearray
 
Ich hab bis jetzt mal den Quellcode zusammengestellt:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var meinObjekt:TButton;
var i : integer;
const max : integer = 5;
begin
  for i := 0 to max do
  begin
      meinObjekt := TButton.Create;  // *
      einArray[i] := meinObjekt;
  end;
end;
*= in dieser Zeile fehlt wohl ein Paramteter: "AOwner: TComponent"

Wenn ich aber das Programm laufen lassen will kommt die Meldung:

Code:
[Fehler] Unit1.pas(41): Nicht genügend wirkliche Parameter
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Was mach ich denn falsch?

Tyrael Y. 12. Nov 2003 12:59

Re: Steuerelementearray
 
so ist es richtig:
Delphi-Quellcode:
meinObjekt := TButton.Create(nil);


ist das array überhaupt deklariert?

Sharky 12. Nov 2003 13:03

Re: Steuerelementearray
 
Hai mirko2000,

setze als Owner z.B. self.

Delphi-Quellcode:
  meinObjekt := TButton.Create(self);  // *

mirko2000 12. Nov 2003 13:07

Re: Steuerelementearray
 
Zitat:

Zitat von Tyrael Y.
ist das array überhaupt deklariert?

Ich hab noch folgendes global deklariert:

var
einArray : array of TButton;

Ist es das was du meinst?



Wenn ich als Parameter 'self' oder 'nil' übergebe kommt diese Meldung:

Code:
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0044D9F3 in Modul 'Project1.exe'. Schreiben von Adresse 00000000'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fotsetzen.

Tyrael Y. 12. Nov 2003 13:10

Re: Steuerelementearray
 
1.
Zitat:

Hai mirko2000,

setze als Owner z.B. self.

Source:

meinObjekt := TButton.Create(self);
2.
Zitat:

so ist es richtig:
Source:

meinObjekt := TButton.Create(nil);

beide Versionen sind richtig.
Unterschied:

bei 1. die übergeordnete Komponente ist der parent
wenn der parent gefreet wird ist auch dein Objekt frei

bei 2. du musst das objekt selber befreien (Objekt.free), da
es keinen parent hat

Sharky 12. Nov 2003 13:10

Re: Steuerelementearray
 
Hai mirko2000,


Zitat:

Zitat von mirko2000
var
einArray : array of TButton;

Das ist ein Dynamisches Array dem Du mit SetLength noch ein Größe geben musst.

Tyrael Y. 12. Nov 2003 13:14

Re: Steuerelementearray
 
jop :)

zb.

Delphi-Quellcode:
setlength(einArray, max);

mirko2000 12. Nov 2003 13:34

Re: Steuerelementearray
 
Yuhuu! Es kommen jetzt zumindest keine Fehlermeldungen mehr!

Delphi-Quellcode:
var
  Form1: TForm1;
  einArray : array of TButton;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var meinObjekt:TButton;
var i : integer;
begin

  SetLength(einArray,9);

  for i := 0 to 8 do
  begin
      meinObjekt := TButton.Create(self);
      einArray[i] := meinObjekt;
  end;

end;

end.
Jetzt hab ich da noch eine (blöde) Frage: Ich hab ja jetzt in meinem Fall 9 TButtons mit den Namen einArray[0 bis 8] erstellt. Wie kann ich die denn jetzt auf meinem Formular anzeigen lassen?

Tyrael Y. 12. Nov 2003 13:38

Re: Steuerelementearray
 
einArray[HierNeZahl] ist jetzt gleichbedeutung mit ButtonX

also

z.B.:
Delphi-Quellcode:
einArray[0].show;
du kannst jetzt auf alle eigenschaften und methoden eines TButton zugreifen

z.B. ebend auch auf show

Tyrael Y. 12. Nov 2003 13:45

Re: Steuerelementearray
 
äh sry, TButton hat kein show

der parent muss noch gesetzt werden

Code:
procedure TForm1.FormCreate(Sender: TObject);
var meinObjekt:TButton;
var i : integer;
begin

  SetLength(einArray,9);

  for i := 0 to 8 do
  begin
      meinObjekt := TButton.Create(self);
      einArray[i] := meinObjekt;
      einArray[i].Parent := self;
  end;

end;

mirko2000 12. Nov 2003 13:46

Re: Steuerelementearray
 
Verstehe ich das jetzt richtig, dass z. B. einArray[0] jetzt die gleich Eigenschaften und Methoden hat wie wenn ich ein Button auf mein Formular ziehe.

Sharky 12. Nov 2003 13:50

Re: Steuerelementearray
 
Hai mirko2000,

guckst Du:

Delphi-Quellcode:
var
  Form1             : TForm1;
  einArray         : array of TButton;
implementation

{$R *.dfm}

procedure TForm1.MyButtonClick(Sender: TObject);
begin
 ShowMessage ('Button ' + (Sender AS TButton).Caption);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i                : integer;
begin
  SetLength(einArray, 9);
  for i := 0 to 8 do
    begin
      einArray[i] := TButton.Create(self);
      with einArray[i] do
        begin
          caption := IntToStr (i);
          left := (i * 55) + 80;
          top := 10;
          height := 30;
          width := 50;
          parent := self;
          visible := True;
          OnClick := myButtonClick;        
        end;
    end;
end;
[EDIT]Ich habe den Code eben noch erweitert. Jetzt hat jeder Button die selbe OnCLICK Funktion.[/EDIT]

Tyrael Y. 12. Nov 2003 13:52

Re: Steuerelementearray
 
ja,

einArray[0] = Adresse zu einem TButton

z.B.:
Button1 = Adresse zu diesem Button

wenn du jetzt die adresse von Button1 in einaray[0] schreiben würdest, dann

ist Button1 = einArray[0]

mirko2000 12. Nov 2003 14:11

Re: Steuerelementearray
 
Es funktioniert jetzt einwandfrei und so wie ich es mir vorgestellt habe!

Danke an alle die mir geholfen haben! :party:

Tyrael Y. 12. Nov 2003 14:13

Re: Steuerelementearray
 
Immer gerne :zwinker:


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