AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCollection, TCollectionItem

Ein Thema von uwewo · begonnen am 6. Okt 2006 · letzter Beitrag vom 6. Nov 2006
Antwort Antwort
Seite 2 von 4     12 34      
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#11

Re: TCollection, TCollectionItem

  Alt 13. Okt 2006, 14:09
So, erstmal Vielen Dank für die große Mühe die Du dir gemacht hast.

Werde mich jetzt am Wochenende ausgehend damit beschäftigen und am Montag meinen Fortschritt mitteilen.

Wünsche Dir ein schönes Wochenende

PS:
Zitat von oki:
Jetzt ist mir aufgefallen, dass du ne menge obstruser Eigenschaften definierst.

Ich unterstell mal, das bei entsprechenden Kalendereinträgen niemand die Breite und Höhe in Pixeln eingibt. Damit sind diese Werte für diese Anwendung wenn schon nicht im Public, so doch im published-Teil sehr fraglich.
Dabei muß ich Dir allerdings Recht geben! Aber nicht vergessen ist meine erste Komponente.
Uwe
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#12

Re: TCollection, TCollectionItem

  Alt 13. Okt 2006, 16:44
Hi uwewo,

Zitat von uwewo:
Aber nicht vergessen ist meine erste Komponente.
Keine Panik, ich lerne auch immer noch kräftig dazu so wie viele andere und es gibt hier im Forum genug Profis vor denen ich den Hut ziehe.

Ich hab gleich noch nen Tip.

wenn ich eine Kompo progge, dann nenne ich sie zuerst TCustomDateLine. Dabei sind alle Eigenschaften public.

Die eigentliche Kompo ist dann TDateLine, bei der ich dann alle notwendigen Eigenschaften published mache. Der Vorteil ist, dass du alle weiteren Nachfahren von deinem TCustomDateLine ableiten kannst, und für den published Teil nur die eigenschaften öffentlich sind die du bei dieser haben willst.

Bsp.:

Delphi-Quellcode:
  TCustomDateLine = class(TCustomGrid)
  private
  public
    property Nachname : String read FNachname write FNachname;
    property Firma : String read FFirma write FFirma;
  end;

  TPrivateDateLine = class(TCustomdateLine)
  published
    property Nachname;
  end;

  TFirmaDateLine = class(TCustomdateLine)
  published
    property Firma;
  end;
Das Bsp. ist jetzt vielleicht nicht so toll, aber was soll's. Ich glaube man sieht worum es geht. Hast du erst mal in deinem TCustomDateLine alle Eigenschaften published, wirst du sie in deinen Nachfahren halt nicht mehr los. das ist manchmal doof.


Also, teste mal rum und schönes Wochenende.

gruß oki
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#13

Re: TCollection, TCollectionItem

  Alt 16. Okt 2006, 06:29
Hi oki,

habe mir das ganze am Wochenende mal angeschaut, leider gab es da zwei Probleme die ich nicht so ganz verstehen kann.

Hier kommt ein Runtime Error, ich vermute mal es liegt daran das die TCollecton noch nicht erstellt wurde.
Delphi-Quellcode:
function TDateItems.Add: TDateItem;
begin
  Result := TDateItem(inherited Add);
  Update(Result);
end;
habe darauf hin mir TListView, TStatusBar angeschaut und den Aufbau verglichen, konnte aber keinen Unterschied zwischen Deinen Deklarationen und z.B. TListView finden.

Zitat:
P.S. in meinem Code per PM entferne die Auskommentierungen vom 11.10 in TDateItems!
Hier erhalte ich einen Fehler beim Kompilieren
Delphi-Quellcode:
constructor TDateItems.Create(DateLine: TDateLine);
begin
// 11.10.2006
  inherited Create(DateLine);
  FDateLine := DateLine;
end;
Hattest Du den Code ausprobiert?
Kann es sein das der constructor von TDateItems nie ausgeführt wird?
Uwe
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#14

Re: TCollection, TCollectionItem

  Alt 16. Okt 2006, 16:20
Hi und sorry,

ich hab es in der Hektik nicht komplet getestet .
Der Fehler liegt hier:
Delphi-Quellcode:
constructor TDateItems.Create(DateLine: TDateLine);
begin
  // 11.10.2006
  inherited Create(TDateItem);
  FDateLine := DateLine;
end;
Du mußt im Aufruf inherited create einen Klassennamen angeben. Das sagt die OH dazu:
Zitat:
Die Methode erzeugt und initialisiert eine Kollektion.

type TCollectionItemClass = class of TCollectionItem;
constructor Create(ItemClass: TCollectionItemClass);

Beschreibung

Create erwartet als Parameter den Namen einer von TCollection abgeleiteten Klasse. Dieser Parameter legt die Klasse der Elemente fest, die von der Methode Add erzeugt werden.
danach ist die Fehlermeldung weg.

Der Kommentar in SetItem muß natürlich auch raus:
Delphi-Quellcode:
procedure TDateItems.SetItem(Index: Integer; Value: TDateItem);
begin
  // 11.10.2006
  inherited SetItem(Index, Value);
end;
somit lauft das Compiling erst mal. Ich teste jetzt aber auch noch mal das creieren der Items.

gruß oki
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#15

Re: TCollection, TCollectionItem

  Alt 16. Okt 2006, 17:01
Hi,

nächster Fehler. Im Constructor deines DateLine's muß natürlich die Collection erzeugt werden, sonst nix mit Items.
Delphi-Quellcode:
constructor TDateLine.Create(AOwner: TComponent);
begin
    inherited Create(AOwner); { geerbten Konstruktor aufrufen  }
    FDateItems := TDateItems.Create(self);
...
Im create des Items dann noch folgendes:
Delphi-Quellcode:
constructor TDateItem.Create(Collection: TCollection);
begin
  inherited Create(Collection);
  FParent := TDateItems(Collection);
  FControlDateItem := TControlDateItem.Create((Collection as TDateItems).FDateLine);
  // ohne Parent keine anzeige (Owner in create alleine reicht nicht)!!!!!!!!!!!!!
  FControlDateItem.Parent := (Collection as TDateItems).FDateLine;
end;
Danach hatte ich dann erst mal keine Fehlermeldungen mehr. Die Items werden auch kreiert, sind aber mit Aufruf von CreateItemFromSel nicht sichtbar (verschieb diese Methode in public). Das liegt daran, dass nach dem Create deines Item keine Breite und Höhe gesetzt wird. Hier hab ich hilfsweise zum Test folgendes gemacht (ist so natürlich nicht korrekt):
Delphi-Quellcode:
procedure TDateLine.CreateItemFromSel;
Var SRect : TRect;
    AItem : TDateItem;
begin
   // 13.10.2006 oki
   // hier wie in einer Collection creieren dabei macht es aber wenig Sinn dieses
   // als globalen Member zu halten
   AItem := self.Items.Add;
   // 13.10.2006 oki FItem.Parent := Self;
   SRect := CellRect(Selection.Left, Selection.Top);

   AItem.FControlDateItem.StartDate := StrToDate(GetSelFirstDate);
   AItem.FControlDateItem.StartTime := StrToTime(GetSelFirstTime);

   AItem.FControlDateItem.Left := SRect.Left; //Pixelangabe
   AItem.FControlDateItem.Top := SRect.Top; //Pixelangabe
   AItem.FControlDateItem.Width := SRect.Right - SRect.Left; //Pixelangabe
   AItem.FControlDateItem.Height := SRect.Bottom - SRect.Top; //Pixelangabe
....
Somit ist jetzt erst mal was zu sehen. Grundsätzlich macht das natürlich so wenig Sin. Das zeichnen sollten wir dann später noch mal überarbeiten.

Ich schlage vor, wir forsten erst mal die Klassen auf und bringen da etwas Ordnung rein. Das aber nicht mehr heute.

Gruß oki
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#16

Re: TCollection, TCollectionItem

  Alt 17. Okt 2006, 07:13
Hi oki,

zwei der drei Fehler konnte ich nun auch gestern Abend lokalisieren und beheben.
Trotzdem war es gut für mich zu sehen, daß ich es auch richtig interpretiert hatte.

Habe kleinere Veränderungen beim zeichnen von TControlDateItem vorgenommen zumindest werden diese
wieder auf Größe der Auswahl gezeichnet.

Was mich allerdings schon gestern nach der Fehlersuche beschäftigt hatte war, warum sieht man im TCollectionEditor im OI beim hinzufügen eines neuen TDateItem nicht die Eigenschaften von TControlDateItem? Deshalb dachte ich mir erweitere ich die Propertys wie folgt.

Delphi-Quellcode:
  TDateItem = class(TCollectionItem)
  private
    FControlDateItem : TControlDateItem;
    FParent : TDateItems;
    //Neu
    FName : String;
  protected
  public
    constructor Create(Collection: TCollection); override;
    //Neu
    property Name : String read FName write FName;//Neu
    property ControlDateItem : TControlDateItem read FControlDateItem write FControlDateItem;
  end;
Leider hatte dies auch nicht den gewünschten Effekt, vielleicht denke ich zu naiv, werde mich aber weiter damit beschäftigen. Weiteres später.
Uwe
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#17

Re: TCollection, TCollectionItem

  Alt 17. Okt 2006, 07:27
Hi uwewo,

wenn du die Eigenschaften des eingebetteten TControlDateItem im OI des TdateItem sehen willst, mußt du wie bei deinem DateLine für Header und SideBar. Dann diese aber auch in den published-Abschnitt. Noch mal zur Erinnerung. Public und published stellen die gleichen Sichtbarkeit dar. Published-Eigenschaften sind genauso öffentlich wie public-Eigenschaften. Nur bei Komponenten werden die published-Eigenschaften im OI angezeigt. Das heißt also, das alle Eigenschaften einer Kompo die in den OI sollen published deklariert werden müssen. Bei einer Klasse die keine Kompo ist macht eine Published-Deklaration wiederum keinen Sinn (wobei sie meines Wissens aber auch keinen Schaden anrichtet).

Also, bau dir einen Wrapper für die TControlDateItem-Eigenschaften oder deklariere alle Eigenschaften die du im DateItem veröffentlichen willst in TDateItem published. Dann mußt du aber für read und write entsprechende Get und Set-Methoden setzen um die geänderten Eigenschaften von TControlDateItem zu holen oder zu setzen. Wenn du ein Bsp. brauchst, sag bescheid.

gruß oki
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#18

Re: TCollection, TCollectionItem

  Alt 18. Okt 2006, 16:10
Hi Leute,

aktuell stellt sich hier die Frage welcher Weg der bessere ist.

1. Nimmt man TCollection oder eigene Listen?
Ich glaube im Moment ist man mit TCollection gut bedient.

2. Zeichnet man die Items in den Canvas der Komponente oder platziert man "kleine Termin-Controls"?
Das Zeichnen im Canvas scheint die übliche Methode zu sein. Bei einem Terminplaner habe ich aber viele Eigenschaftsänderungen die ich auch per Drag&Drop ausführen möchte (verschieben, verlängern ...). dies müßte beim Zeichnen alles seperat behandelt werden. Ich habe das Gefühl, das das mit den Controls besser klappen kann (vorallem mit weniger Aufwand).
Was die Performance dazu sagt ist für mich bis jetzt aber im dunkeln. Vielleicht hat dazu einer entsprechende Erfahrungen und kann hier mal ne'n tipp lassen.

Dank und gruß oki
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#19

Re: TCollection, TCollectionItem

  Alt 18. Okt 2006, 16:19
Hi uwewo,

stell dein Demo doch mal hier mit rein. Wenn einige das sehen, dann kommt bestimmt ne Menge positiv zu nutzende Kritik. Ich find die Kompo schon mal cool. Code schau ich mir noch an.

edit: o.k. vorher sollten wir aber noch massiv an den Zeichenroutinen arbeiten. Das funzt alles erst beim scrollen. Für den Rest klappt nichts. edit/

gruß oki
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#20

Re: TCollection, TCollectionItem

  Alt 19. Okt 2006, 06:12
Zitat von oki:
o.k. vorher sollten wir aber noch massiv an den Zeichenroutinen arbeiten. Das funzt alles erst beim scrollen. Für den Rest klappt nichts.
Ja das stimmt und daran arbeite ich gerade, habe mich entschieden TControlDateItem nun von TGraphicControl abzuleiten, da ich eigentlich kein Fenster Handle benötige.
Falls es aber doch irgendwann der Fall sein sollte, werde ich TCustomControl verwenden.

Um für alle die vielleicht irgenwann ein ähnliches Problem haben sollten, werde ich spätestens nächste Woche den kompletten Aufbau und das erstellen der Klassen hier als Code reinstellen.

Zitat von oki:
stell dein Demo doch mal hier mit rein. Wenn einige das sehen, dann kommt bestimmt ne Menge positiv zu nutzende Kritik. Ich find die Kompo schon mal cool.
Mal schauen wie weit ich heute mit den Zeichenroutinen komme, dann folgt das Demo.


Uwe
Uwe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz