vererbung eines TPanel's?
Re: vererbung eines TPanel's?
hmm Michl,
ich habe da irgendwie noch einen knoten in Kopf
ich will ja garnicht die Caption haben
TButton(Sender).Caption;
die haben bei mir alle die gleiche Cation
sondern ich würde gerne dsVolk.DataSet.FieldByName('ID').AsString) das in meiner
procedure TfrmKarte2.Button1Button1Click haben.
in deinen Beispiel würde ich auch immer nur Hallo angezeigt bekommen und nicht auf welchen Button ich geklickt habe
ich habe da irgendwie noch einen knoten in Kopf
ich will ja garnicht die Caption haben
TButton(Sender).Caption;
die haben bei mir alle die gleiche Cation
sondern ich würde gerne dsVolk.DataSet.FieldByName('ID').AsString) das in meiner
procedure TfrmKarte2.Button1Button1Click haben.
in deinen Beispiel würde ich auch immer nur Hallo angezeigt bekommen und nicht auf welchen Button ich geklickt habe
Re: vererbung eines TPanel's?
Ja, das Hallo ist aber in jeder Instanz separat hinterlegt.TT73GP7 hat geschrieben:in deinen Beispiel würde ich auch immer nur Hallo angezeigt bekommen und nicht auf welchen Button ich geklickt habe
Du kannst dem Button.Tag eine ID zuweisen, wie Mathias weiter oben schon schrieb. Du kannst dem Button.Tag auch ein Objekt zuweisen. Du kannst eine Liste, Array, Map oder sonstiges nehmen und den jeweiligen Button einfügen und mit deren Index arbeiten.
Das ist sicher mit Kanonen auf Spatzen geschossen, aber man könnte eine eigene Klasse schreiben, wo jede Instanz dann unter anderem ein eigenes Property vom Typ TField (beinhaltet dann z.B. das Field dsVolk.DataSet.FieldByName('ID')) und ein TButton (welcher auf dem Formular angezeigt wird) hat. Je TField würde dann in der jeweiligen Instanz das OnClick abgearbeitet. Selbstverständlich können dann in dieser Klasse verschiedene weitere Properties, die man so braucht, zugefügt werden.
Mir fällt noch mehr Gewurstel ein. Wenn du zielführende Tipps haben willst, müsstest du wahrscheinlich ein paar Informationen liefern.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 6193
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
also das ganze läuft so:
Benutzer öffnet die Form
auf der Form gibt es n Buttons die werden aufgrund von Datenbank abfragen erzeugt
Jeder Button ist ein Ameisenvolk in Gebit x und y (nicht wundern hat mit Insekten Forschung zutun)
nun kann der Förster eintragen wie hoch der Haufen ist und wann er gemessen hat (klingt blöd)
also Jeder Knopf ein Volk
daher frage ich mich ob ich jeden Knopf gleich eine Id mitgeben kann und diese In der Procedur auslesen kann?
Im Anhang habe ich noch 2 Demos, wie man Panels mit Buttons dynamisch erzeugen kann.
Vielleicht hilft dir dies als Gedankenstütze.
- Dateianhänge
-
- Timer_Ausgabe_Frame.zip
- (4.64 MiB) 64-mal heruntergeladen
-
- Timer_Ausgabe.zip
- (4.65 MiB) 56-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: vererbung eines TPanel's?
nee
ich habe nun soviel rumgebastelt
und alles ausprobiert
ich glaube die welt hat sich gegen mich verschworen und die Freimaurer hängen da garantiert mit drin!
also ich packe mal den Code hier rein
kann mir mal jemand sagen wo denn der harken ist?
und alles zusammen unten in der Zip datei
ich habe nun soviel rumgebastelt
und alles ausprobiert
ich glaube die welt hat sich gegen mich verschworen und die Freimaurer hängen da garantiert mit drin!
also ich packe mal den Code hier rein
kann mir mal jemand sagen wo denn der harken ist?
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes,
SysUtils,
db,
FileUtil,
ZConnection,
ZDataset,
Forms,
Controls,
Graphics,
Dialogs,
ExtCtrls,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Anzeige: TLabel;
dsArten: TDataSource;
ScrollAuswahl: TScrollBox;
ZConnection: TZConnection;
zArten: TZQuery;
procedure FormCreate(Sender: TObject);
private
// Edit: TEdit;
Panel: TPanel;
Label1: TLabel;
Image: TImage;
Button1: TButton;
public
procedure Button1Button1Click(Sender: TObject);
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
nPanelTop : Integer;
begin
zArten.Active := True;
dsArten.DataSet.First;
nPanelTop := 2;
while not dsArten.DataSet.EOF do begin
Panel := TPanel.Create(Self);
with Panel do begin
Parent := ScrollAuswahl;
Top := nPanelTop;
Panel.Height := 122;
end;
nPanelTop := (nPanelTop + 2 + 122);
Button1 := TButton.Create(Self);
with Button1 do begin
Button1.Parent := Panel;
// Button1.Caption := dsArten.DataSet.FieldByName('ID').AsString;
Button1.Caption := '#';
Button1.OnClick := @Button1Button1Click;
Button1.Left := 145;
Button1.Width := 25;
Button1.Top := 95;
end;
Label1 := TLabel.Create(Self);
with Label1 do begin
Label1.Parent := Panel;
Label1.Caption := 'Art: '+dsArten.DataSet.FieldByName('Art').AsString + ' NR ' + dsArten.DataSet.FieldByName('ID').AsString;
Left := 5;
Top := 5;
end;
Image := TImage.Create(Self);
with Image do begin
Image.Parent := Panel;
if (dsArten.DataSet.FieldByName('Art').AsString = 'Ameisenhaufen') then image.Picture.LoadFromFile('C:\wald\ameise.png')
else if (dsArten.DataSet.FieldByName('Art').AsString = 'Marder') then image.Picture.LoadFromFile('C:\wald\Marder.png')
else image.Picture.LoadFromFile('C:\wald\vogel.png');
image.Stretch := True;
Image.Height := 70;
Left := 30;
Top := 30;
end;
dsArten.DataSet.Next;
end;
end;
procedure TForm1.Button1Button1Click(Sender: TObject);
begin
// Anzeige.Caption := 'Hallo du bist '+Button1(Sender).Caption;
// Anzeige.Caption := 'Hallo du bist '+dsArten.DataSet.FieldByName('ID').AsString;
end;
end.
und alles zusammen unten in der Zip datei
- Dateianhänge
-
- Wald.zip
- (573.06 KiB) 58-mal heruntergeladen
-
- Beiträge: 6193
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
Kannst du noch schreiben, wo es hakt ?
Ohne Datenbank-Zeugs, würde es so laufen, mit der Datenbank kann ich es nicht test, da nicht installiert.
Ohne Datenbank-Zeugs, würde es so laufen, mit der Datenbank kann ich es nicht test, da nicht installiert.
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
nPanelTop, i: integer;
begin
nPanelTop := 2;
for i := 0 to 4 do begin // Nur als Test, da keine Datenbank.
Panel := TPanel.Create(Self);
with Panel do begin
Parent := ScrollAuswahl;
Top := nPanelTop;
Panel.Height := 122;
end;
nPanelTop := (nPanelTop + 2 + 122);
Button1 := TButton.Create(Self);
with Button1 do begin
Button1.Parent := Panel;
// Button1.Caption := dsArten.DataSet.FieldByName('ID').AsString;
Button1.Caption := '#'+IntToStr(i); // neu
Button1.OnClick := @Button1Button1Click;
Button1.Left := 145;
Button1.Width := 25;
Button1.Top := 95;
end;
Label1 := TLabel.Create(Self);
with Label1 do begin
Label1.Parent := Panel;
Label1.Caption := 'Art: ' + IntToStr(i);
Left := 5;
Top := 5;
end;
Image := TImage.Create(Self);
with Image do begin
Image.Parent := Panel;
image.Picture.LoadFromFile('vogel.png');
image.Stretch := True;
Image.Height := 70;
Left := 30;
Top := 30;
end;
end;
end;
procedure TForm1.Button1Button1Click(Sender: TObject);
begin
Anzeige.Caption := 'Hallo du bist ' + TButton(Sender).Caption; // neu
// Anzeige.Caption := 'Hallo du bist '+dsArten.DataSet.FieldByName('ID').AsString;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: vererbung eines TPanel's?
ohh kein Zeos Installiert?
ich sollte mir mal angewöhnen Beispiele mit Lazarus Bordmitteln zuentwickeln.
also der Fehler war tatsächlich bei dem OnClick
so läuft es nun
aber das wird nur eine Notlösung sein (finde es schöner wenn die Bezeichnung gleich ist)
kann man sowas eigentlich auch über den Namen machen?
lg, Igor
ich sollte mir mal angewöhnen Beispiele mit Lazarus Bordmitteln zuentwickeln.
also der Fehler war tatsächlich bei dem OnClick
Code: Alles auswählen
Anzeige.Caption := 'Hallo du bist ' + TButton(Sender).Caption;
so läuft es nun
aber das wird nur eine Notlösung sein (finde es schöner wenn die Bezeichnung gleich ist)
kann man sowas eigentlich auch über den Namen machen?
lg, Igor
- kupferstecher
- Beiträge: 422
- Registriert: Do 17. Nov 2016, 11:52
Re: vererbung eines TPanel's?
TT73GP7 hat geschrieben:Code: Alles auswählen
procedure TForm1.Button1Button1Click(Sender: TObject);
begin
// Anzeige.Caption := 'Hallo du bist '+dsArten.DataSet.FieldByName('ID').AsString;
end;
Warum kann das nicht funktionieren? Die Schleife "while not dsArten.DataSet.EOF" über die Elemente ist zum Zeitpunkt deines Button-Klicks schon durch. In dsArten.DataSet steht also nichts sinnvolles mehr drin. Zwar is Button1Button1Click eine Methode und hat damit Zugriff auf die Eigenschaften des zugehörigen Objekts, das ist in diesem Fall aber Form1 und zwar für alle Buttons - ungeschickt gewählt - und ist damit zur Unterscheidung, welcher Button gedrückt wurde, unbrauchbar.
Mach dir lieber eine eigene Klasse in der du die "Wald-Elemente" organisierst:
Code: Alles auswählen
Type TWaldElement = class
Button1: TButton;
RelatedDBSet: TWasauchimmer; //Hier wird dein Datensatz referenziert, so kannst du später darauf zugreifen, lesend und schreibend
public
Constructor Create(ADBSet:TWasauchimmer);
protected
Procedure ButtonClick(Sender: TObject);
end;
IMPLEMENTATION
Constructor Create(ADBSet:TWasauchimmer);;
begin
self.RelatedDBSet:= ADBSet; //Für späteren Zugriff auf den Datensatz abspeichern
Button1:= TButton.Create(Form1);
//...
Button1.OnClick:= @ButtonClick; //Hier wird implizit die eigene Instanz übergeben!
end;
procedure TForm1.Button1Button1Click(Sender: TObject);
begin
Anzeige.Caption := 'Hallo, ich bin ein '+RelatedDBSet.FieldByName('ID').AsString; //RelatedDBSet ist hier für jeden Button anders
end;
Und entsprechend bei der Initialisierung:
Code: Alles auswählen
while not dsArten.DataSet.EOF do begin
TWaldElement.Create(dsArten.DataSet);
dsArten.DataSet.Next;
end;
Grüße
-
- Beiträge: 6193
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
kann man sowas eigentlich auch über den Namen machen?
Kann man. Man sollte da aber keine Sonderzeichen verwenden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: vererbung eines TPanel's?
hmm
das über Klassen ist auch nee Interessante Art. das werde ich nachher mal ausprobieren.
aber nochmal was anderes.
gibt es eine Möglichkeit alle Elemente die ich erzeugt habe wieder von der Form zu entfernen?.
z.B. alle Buttons auf einmal ohne die Form zu Schließen verschwinden lassen?
VG
Igor
das über Klassen ist auch nee Interessante Art. das werde ich nachher mal ausprobieren.
aber nochmal was anderes.
gibt es eine Möglichkeit alle Elemente die ich erzeugt habe wieder von der Form zu entfernen?.
z.B. alle Buttons auf einmal ohne die Form zu Schließen verschwinden lassen?
VG
Igor
Re: vererbung eines TPanel's?
ich dachte mir das man doch eigentlich ein Label mit Destroy entfernen kann.
leider nein
die zur Zeit ja alle Label1
leider nein
Code: Alles auswählen
Label1.Destroy
die zur Zeit ja alle Label1
Re: vererbung eines TPanel's?
TT73GP7 hat geschrieben:ich dachte mir das man doch eigentlich ein Label mit Destroy entfernen kann.
leider neinCode: Alles auswählen
Label1.Destroy
die zur Zeit ja alle Label1
Warum soll das denn nicht funktionieren? Ich klicke mir ein Label und einen Button aufs Formular, und wenn der Button "Label1.Destroy" (oder besser: "Label1.Free") aufruft, ist das Label weg.
Leider verstehe ich den Nachsatz "die zur Zeit ja alle Label1" nicht - Leute, lest euch doch bitte nochmal durch, was ihr geschrieben habt!
-
- Beiträge: 6193
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
Destroy sollte man nicht verwenden besser ist Free.
Was noch ein Vorteil wäre, wen du deine Panels in eine dynamische Array steckst, somit hast du direkten Zugriff auf jedes einzelne Panel, und somit auch deren Labels.
Was noch ein Vorteil wäre, wen du deine Panels in eine dynamische Array steckst, somit hast du direkten Zugriff auf jedes einzelne Panel, und somit auch deren Labels.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot