| Autor |
Beitrag |
Major1337
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 08:41
Zuletzt bearbeitet von Major1337 am Di 28.07.09 17:17, insgesamt 1-mal bearbeitet
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 08:51
Moin,
Du könntest eine kleine Hilfsklasse schaffen, die die Eingeschaften enthält, die Du jetzt in Tag, Hint und FOtherButtons hältst. Für jede Eigenschaft eine Property. Außerdem schaffst Du Dir eine TObjectList, in der Du eine Liste von Instanzen dieser Klassen hälst. Für jeden Button eine Instanz. Und schlussendlich speicherst Du im Tag des Buttons nur noch einen Verweis auf die Hilfsklase mit den Eingenschaften.
Das hat den Vorteil, dass Du nur die Hilfsklasse um Properties erweitern musst, wenn noch weitere Eigenschaften dazu kommen.
Gruß,
Jens
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 09:24
@Jens
Danke, dein Vorschlag ist wirklich gut.
Sollen die die Eigenschaften von Width, Height, Top etc. auch in der Hilfsklasse
bei den Proberties gespeichert werden?
Ich habe aber wirklich keine Ahnung wie ich das genau realsieren soll, könntest du mir mal zeigen wie sowas aussieht?
Ich weiß das ich soetwas alleine lösen sollte, aber ich komme mit den Klassen von Delphi nicht so klar. Da man i-wie die Klasse nach dem erstellen noch frei geben muss, wegen der Speicherbelegung und solche Dinge. Ich werde da auf jeden Fall noch lernen, aber jetzt muss ich erstmal diese Aufgabe lösen.
Mfg
DaaN
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 09:34
Naja, das Width, Height und so weiter bezieht sich ja direkt auf den Button, bzw. ändert das Aussehen des Buttons. Daher sollte man sie auch im Button lassen.
Ich habe es so verstanden, dass noch weitere Eigenschaften hast, wofür Du Properties (z.B. das TAG) des Buttons "missbraucht" hast, um sie zu speichern. Das missbrauchen würde man mit der Hilfsklasse vermeiden.
Die generelle Funktion der TObjectList kannst Du hier durcharbeiten: www.delphi-treff.de/...als/vcl/tobjectlist/
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 09:45
hmm.. Kannst du mir das nicht bitte machen? Ich möchte endlich eine andere Aufgabe bekommen, da ich diese total hasse und wenn ich die jetzt noch alleine löse brauche ich dafür mind. 3 Std. bis das perfekt läuft. Du brauchst ja auch nicht alle proberties bei der Klasse zu deklarieren, die restlichen füge ich dann selber dazu.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 09:47
Was zahlst Du?
Sorry, aber ein bisschen Eigeninitiative musst Du schon zeigen. Das verlinkte Tutorial hast Du in < 1 Stunde durchgearbeitet und Du hast etwas gelernt!
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 09:53
bitte, es geht ja nicht nur im die Funktion TObjectList, die Klasse muss ja auch noch erstellt werden.
Wenn du mir das machen würdest, könnte ich das als Beispiel nehmen um zu verstehen wie soetwas "komplexes" aufgebaut ist.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 09:59
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 10:05
Danke, aber wo taucht jetzt da die Funktion TObjectList auf?
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Fr 24.07.09 10:07
Leite Doch einfach eine eigene Klasse ab:
hier nur inkomplett zusammengehackt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| unit MYButton; interface uses
Windows, SysUtils, Messages, Classes, Controls, Forms , Buttons; Type TMyButton = class(TButton) private F_iInfo1:Integer; F_sInfo1:String; protected Procedure SetiInfo1(Value:Integer) Procedure SetsInfo1(Value:String) public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published Property iInfo1:Integer Read F_iInfo1 Write SetiInfo1; Property sInfo1:Integer Read F_sInfo1 Write SetsInfo1; end;
procedure Register; implementation Procedure TMyButton.SetiInfo1(Value:Integer); begin F_iInfo1 := Value; end;
procedure Register; begin RegisterComponents('WoAuchImmer', [TMyButton]); end;
end. |
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 10:07
Arbeite das Tutorial durch. Sorry, aber ich werde langsam wortkarg.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 11:06
Zuletzt bearbeitet von Major1337 am Di 28.07.09 17:18, insgesamt 1-mal bearbeitet
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 11:18
Das ist die Eigeninitiative, die ich sehen wollte!  Dann werde ich auch wieder Gesprächiger.
Es gibt in Delphi 2 (3) Möglichkeiten, Properties zu erstellen.
In der ersten Möglichkeit wird in der Property-Deklaration direkt auf die Variablen verwiesen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| THilfklasse = class(TObject) Private F_Eigenschaft1 : Integer; F_Eigenschaft2 : Integer; F_Eigenschaft3 : Integer; Public Property Eigenschaft1 : integer Read F_Eigenschaft1; Property Eigenschaft2 : integer Read F_Eigenschaft2 Write F_Eigenschaft2; Property Eigenschaft3 : integer Write F_Eigenschaft2; end; |
Bei der 2. Möglichkeit setzt Du die Werte mit Prozeduren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| THilfklasse = class(TObject) Private F_Eigenschaft1 : Integer; F_Eigenschaft2 : Integer; F_Eigenschaft3 : Integer; function get_Eigenschaft1: integer; function get_Eigenschaft2: integer; procedure set_Eigenschaft2(const Value: integer); procedure set_Eigenschaft3(const Value: integer); Public Property Eigenschaft1 : integer Read get_Eigenschaft1; Property Eigenschaft2 : integer Read get_Eigenschaft2 Write set_Eigenschaft2; Property Eigenschaft3 : integer Write set_Eigenschaft3; end; implementation
function THilfklasse.get_Eigenschaft1: integer; begin result := F_Eigenschaft1; end;
function THilfklasse.get_Eigenschaft2: integer; begin result := F_Eigenschaft2; end;
procedure THilfklasse.set_Eigenschaft2(const Value: integer); begin F_Eigenschaft2 := Value; end;
procedure THilfklasse.set_Eigenschaft3(const Value: integer); begin F_Eigenschaft3 := Value; end; |
Du kannst Möglichkeit 1 und 2 mischen, also z.B. im Read direkt auf die Variable verweisen, aber im Write die Prozedur verwenden.
Die 3. Möglichkeit hatte ich oben schon gezeigt, das sind einfach nur Public-Variablen. Diese Möglichkeit würde ich als Quick&Dirty bezeichnen. Für Deinen Zweck würde ich die erste Möglichkeit verwenden.
Jens
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 24.07.09 11:39
Kleine Anregung: statt die Tag-Property des Buttons als Verweis zu verwenden, würde ich eine Klasse anlegen, die die Zusatzinformationen und die Button-Referenz enthält und diese dann in einer TObjectlist verwalten.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TMyButton = class private FAdditionalInfo: integer; FButton: TButton; public property AdditionalInfo: integer read FAdditionalInfo write FAdditionalInfo; property Button: TButton read FButton; end; |
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 11:40
Zuletzt bearbeitet von Major1337 am Di 28.07.09 17:18, insgesamt 1-mal bearbeitet
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 11:46
Es ist in Delphi üblich, dass Du in diesem Fall die Variable mit F als Präfix benennst. Also oben:
Delphi-Quelltext 1: 2:
| private F_CurrentActivityNumber: integer; |
Immer, wenn Du einen Button erstellst, erstellst Du auch eine Instanz der Hilfsklasse, weißt die Properties zu und speicherst sie in der TObjectList.
Wobei ich sagen muss, dass ich den Vorschlag von DeddyH super finde. Würde ich einarbeiten.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 11:50
@DeddyH
gute Idee. Die werde ich auf jeden Fall berücksichtigen.
@Jens
Danke für deine hilfreichen Tips, ich gehe nun erstmal in die Kantine essen und versuche danach danach die Instanzen zuerstellen. Ich hoffe du und andere bleiben mir noch weiter als Ansprechpartner zur Verfügung.
|
|
Major1337 
      
Beiträge: 29
|
Verfasst: Fr 24.07.09 12:54
wenn ich aber den Präfix F davor setze, dann bekomme ich bei Read lauter Fehlermeldungen das get_"..." nicht deklariert ist. ;(
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 24.07.09 13:02
Du musst das F auch überall da davor setzen, wo die Variable gemeint ist.
Delphi-Quelltext 1: 2: 3: 4:
| private FMyVar: integer; public property MyVar: integer read FMyVar write FMyVar; |
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.07.09 13:03
Du musst es dann an den Stellen auch ändern, damit die Property direkt auf die Variable zugreift.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|