vererbung eines TPanel's?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

vererbung eines TPanel's?

Beitragvon TT73GP7 » 3. Mai 2017, 17:23 vererbung eines TPanel's?

Hallo zusammen,

also nun geht es endlich los.
Ich will mich nun Tiefer in das Thema vererbung einarbeiten.

Auf einer Form habe ich ein TPanel
dieses hat zwei Edit Felder und ein Label drauf.

dieses Panel (Panel1) möchte ich gerne n mal zur Programmlaufzeit erzeugen

a wie mache ich das?
b wie halte ich die einzelnen Kinder (?) auseinander?

VG,
Igor
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon Mathias » 3. Mai 2017, 17:35 Re: vererbung eines TPanel's?

Suchst du so was ?

Oder willst du eine neue Komponente schreiben, welche die Edit und Labels auf einem Panel haben ?
Code: Alles auswählen
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Panel: TPanel;
    Edit: TEdit;
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel := TPanel.Create(Self);
  with Panel do begin
    Parent := Self;
  end;
  Edit := TEdit.Create(Self);
  with Edit do begin
    Edit.Parent := Panel;
    Left := 10;
    Top := 10;
  end;
end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 3. Mai 2017, 18:04 Re: vererbung eines TPanel's?

joar

das geht genau in die Richtung

:)

aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?

lg, Igor
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon theo » 3. Mai 2017, 18:25 Re: vererbung eines TPanel's?

TT73GP7 hat geschrieben:das geht genau in die Richtung

Das Beispiel hat aber mit Vererbung nichts zu tun.

TT73GP7 hat geschrieben:aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?


Dafür ist der Parameter "Sender" da,
theo
 
Beiträge: 7883
Registriert: 11. Sep 2006, 18:01

Beitragvon gladio » 3. Mai 2017, 18:32 Re: vererbung eines TPanel's?

Abgesehen vom praktischen Nutzen...
Man könnte ein Label auf das Panel platzieren und der Caption des Labels den Wert eines Zählers zuordnen (ich nehme an du willst die Panele in einer Schleife erzeugen)
Die Label.Caption lässt sich dann leicht auslesen und das jeweilige Panel bestimmen. Das Label muß dazu auch nicht sichtbar sein.
gladio
 
Beiträge: 71
Registriert: 21. Jun 2014, 05:15
Wohnort: Ostseestrand
OS, Lazarus, FPC: Win7/10-32/64 | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 3. Mai 2017, 18:57 Re: vererbung eines TPanel's?

joar

das geht genau in die Richtung

:)

aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?

Suchst du etwas in dieser Richtung ?

Man könnte ein Label auf das Panel platzieren und der Caption des Labels den Wert eines Zählers zuordnen (ich nehme an du willst die Panele in einer Schleife erzeugen)

Anstelle der Caption, würde ich "Tag" verwenden.
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: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 3. Mai 2017, 19:16 Re: vererbung eines TPanel's?

hmm ok

das muss ich mal durchprobieren
klingt garnicht so schlecht das auf diese art und weise zumachen
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

Beitragvon kupferstecher » 4. Mai 2017, 09:29 Re: vererbung eines TPanel's?

'Tag' sollte man eigentlich nicht verwenden, ist eher unschön und sollte nur in der Not gemacht werden (Lesbarkeit).

Du kannst bei der Erzeugung schon eine beliebige Methode (aber mit passenden Funktions-Argumenten) zuweisen:
Code: Alles auswählen
Panel1.Button1.OnClick:= @StartKnopfClick;


Die Funktion wird in einer (beliebigen*) Klasse folgendermaßen Definiert:
Code: Alles auswählen
Procedure StartKnopfClick(Sender: TObject);
begin
  writeln('START');
end;


Das Argument (Sender: TObject) ist obligatorisch und variiert je nach zugeordnetem Ereignis. Die nötigen Parameter finden sich in der Doku oder du kannst auch im Objektinspektor für ein gleiches Control ein Eventhandler erzeugen lassen und die Funktions-Argumente dort abschauen.

*Da es sich um eine Methode habdelt, die Instanz der Klasse also mitgeliefert wird, bietet sich es an, die Prozedur in der übergeordneten Klasse zu definieren, in deinem Fall in der von TPanel abgeleiteten Klasse. Damit sind in der Methode alle dem Element zugehörigen Eigenschaften verfügbar obwohl die Funktion nur einmal definiert wurde. Bei Definition innnerhalb der übergeordneten Klasse wird in der Click-Methode 'Sender.Parent' und 'self' immer das gleiche Objekt sein.

Folgender Code wird in diesem Fall also genau den Text des Button ändern, welcher gedrückt wurde.
Code: Alles auswählen
Procedure StartKnopfClick(Sender: TObject);
begin
  Button1.Caption:= 'START';
  //identisch mit
  Self.Button1.Caption:= 'START';
  //identisch mit
  TButton(Sender).Caption:= 'START';
  //identisch mit**
  TButton(Sender).Parent.Caption:= 'START';
  //identisch mit**
  TControl(Sender).Parent.Caption:= 'START';
end;

**bei korrekt zugeordnetem Parent
kupferstecher
 
Beiträge: 68
Registriert: 17. Nov 2016, 11:52

Beitragvon theo » 4. Mai 2017, 10:05 Re: vererbung eines TPanel's?

kupferstecher hat geschrieben:Das Argument (Sender: TObject) ist obligatorisch und variiert je nach zugeordnetem Ereignis. Die nötigen Parameter finden sich in der Doku oder du kannst auch im Objektinspektor für ein gleiches Control ein Eventhandler erzeugen lassen und die Funktions-Argumente dort abschauen.

Geht auch viel einfacher. Z.B.
Code: Alles auswählen
ButtonNew.OnKeyDown:=

schreiben, Caret hinter das Gleichheitszeichen setzen und entweder: Strg+Umschalt+C
oder mit Dialog: Strg+Umschalt+X drücken.
Danach wird der nötige Code erstellt.
theo
 
Beiträge: 7883
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 4. Mai 2017, 17:22 Re: vererbung eines TPanel's?

'Tag' sollte man eigentlich nicht verwenden, ist eher unschön und sollte nur in der Not gemacht werden (Lesbarkeit).

Wieso nur zur Not ?
Wen man eine Array von Buttons hat, ist dies der einfachste Weg diese durch zu nummerieren.
Wen es einzelne dynamisch erzeugte Buttons sind, dann nehme ich für jeden Button ein extra OnClick-Ereignis.


oder mit Dialog: Strg+Umschalt+X drücken.

Den kannte ich noch nicht. :shock:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 4. Mai 2017, 20:55 Re: vererbung eines TPanel's?

theo hat geschrieben:Geht auch viel einfacher. Z.B.

Guter Hinweis!

Mathias hat geschrieben:Wieso nur zur Not ?

Weil 'Tag' halt alles sein kann. Wenn es wirklich so eine Eigenschaft braucht, würde ich lieber die Componente ableiten und eine aussagekräftige Eigenschaft hinzufügen. Das sind wenige Zeilen Code. Oder halt in eine Liste packen.

Wenn man Standardkomponenten dynamisch erzeugt, braucht man doch normalerweise sowieso noch weitere Funktionalitäten, d.h. der Button ist Teil einer Klasse, in welcher man dann auch wieder beliebige Variablen definieren kann.
kupferstecher
 
Beiträge: 68
Registriert: 17. Nov 2016, 11:52

Beitragvon Mathias » 4. Mai 2017, 21:39 Re: vererbung eines TPanel's?

Weil 'Tag' halt alles sein kann.

Man könnte auch ".Name" nehmen, nur geht dort die Auswertung länger, das Strings verglichen werden müssen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 5. Mai 2017, 08:03 Re: vererbung eines TPanel's?

das ja ziemlich geil mit dem "Strg+Umschalt+C"

hmm es funktioniert auch alles so wie es soll
aber!

kann ich da irgendwie eine ID mitgeben?

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?

das mit dem Sender hab ich irgendwie noch nicht ganz verstanden :(

und ja ich kann es einfach mit DB-Grids etc machen
hab ich auch
nur wollte ich auch neues mal ausprobieren und der Anwendung etwas schwung mitgeben
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

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

hmmm

warum geht sowas nicht ?

Code: Alles auswählen
 
 
       Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)] := TButton.Create(Self);
 
 
       Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)].OnClick   := @Button1Button1Click;
 
 
procedure TfrmKarte2.Button1Button1Click(Sender: TObject);
begin
  LAnzeige.Caption:= 'Hallo '+  Sender.ToString;
end;
 
 
 
TT73GP7
 
Beiträge: 182
Registriert: 29. Mär 2016, 19:45

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

Weil es viel besser ist.

Mit dem Sender erhälst du bereits das Objekt. In diesem Fall eine Instanz von einem TButton:
Code: Alles auswählen
...
  Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)] := TButton.Create(Self);
  Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)].OnClick := @Button1Button1Click;
  Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)].Caption := 'Hallo';
...
procedure TfrmKarte2.Button1Button1Click(Sender: TObject);
begin
  LAnzeige.Caption:= TButton(Sender).Caption;
end;

Idealerweise fragt man noch vorher ab, ob es sich beim Sender um einen TButton handelt:
Code: Alles auswählen
procedure TfrmKarte2.Button1Button1Click(Sender: TObject);
begin
  if Sender is TButton then   
    LAnzeige.Caption:= TButton(Sender).Caption;
end
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2169
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

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried