vererbung eines TPanel's?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: vererbung eines TPanel's?

Beitragvon TT73GP7 » 5. Mai 2017, 10:35 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
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon Michl » 5. Mai 2017, 12:29 Re: vererbung eines TPanel's?

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; 
Michl
 
Beiträge: 2191
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Mathias » 5. Mai 2017, 16:52 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. :wink:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 8. Mai 2017, 14:44 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?

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon Mathias » 8. Mai 2017, 17:32 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.
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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 9. Mai 2017, 12:00 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

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
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon kupferstecher » 9. Mai 2017, 13:47 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
kupferstecher
 
Beiträge: 77
Registriert: 17. Nov 2016, 11:52

Beitragvon Mathias » 9. Mai 2017, 16:56 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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 11. Mai 2017, 14:13 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
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon TT73GP7 » 12. Mai 2017, 09:26 Re: vererbung eines TPanel's?

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
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon wp_xyz » 12. Mai 2017, 09:52 Re: vererbung eines TPanel's?

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!
wp_xyz
 
Beiträge: 2280
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 12. Mai 2017, 17:25 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.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •
Vorherige

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried