vererbung eines TPanel's?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: vererbung eines TPanel's?

Beitrag von Michl »

TT73GP7 hat geschrieben:in deinen Beispiel würde ich auch immer nur Hallo angezeigt bekommen und nicht auf welchen Button ich geklickt habe
Ja, das Hallo ist aber in jeder Instanz separat hinterlegt.

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; 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

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. :wink:
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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

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?

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

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

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.

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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

ohh kein Zeos Installiert?

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

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: vererbung eines TPanel's?

Beitrag von kupferstecher »

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

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

ich dachte mir das man doch eigentlich ein Label mit Destroy entfernen kann.

leider nein

Code: Alles auswählen

 
Label1.Destroy
 


die zur Zeit ja alle Label1

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: vererbung eines TPanel's?

Beitrag von wp_xyz »

TT73GP7 hat geschrieben:ich dachte mir das man doch eigentlich ein Label mit Destroy entfernen kann.

leider nein

Code: 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!

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten