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 3 von 4     123 4      
oki

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

Re: TCollection, TCollectionItem

  Alt 19. Okt 2006, 08:20
Hi uwewo,

das mit den Zeichenroutine ist eigentlich nicht so schwer. Deine Items werden ja schon richtig gezeichnet. Überschreibe die procedure Paint von TDateLine und schon werden alle Items dem aktuellen DateLine automatisch angepaßt.

Delphi-Quellcode:
    procedure Paint; override;
...

procedure TDateLine.Paint;
begin
  inherited;
  DrawItems;
end;
somit werden deine Items immer mit verändert wenn TDateLine neu gezeichnet wird, egal warum. Dazu must du aber auch die Ermittlung der Dimensionen deines Item dynamisch regeln. Das würde so gehen.

- Alle Datums/Zeitangaben werden als property gehalten und deren Änderung löst ein Item.Redraw aus,
- Im Item.Redraw wird zuerst left, top usw. in Bezug auf das als Eigenschaft gehaltene FDateLine ermittelt,
- das Item wird mit den neuen Koordinaten im DateLine gezeichnet.

Die entscheidende Frage ist dann immer nur wer das Zeichnen übernimmt, DateLine oder das Item selbst.

Unter dem Strich berechnet jedes Item seine Koordinaten in Bezug auf TDateLine zum Zeitpunkt des Neuzeichnens selbst. Von Außen reicht dann lediglich ein Aufruf von Redraw oder Paint oder Invalidate....


Gruß oki
  Mit Zitat antworten Zitat
uwewo

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

Re: TCollection, TCollectionItem

  Alt 19. Okt 2006, 09:58
Hi oki,

genau daran sitze ich gerade, allerdings muß man auch auf das StartDatum und EndDatum von TDateLine
eingehen. Also ob Items überhaupt gezeichnet werden sollen oder nicht.

Probleme habe ich nämlich, wenn ein Item z.Bsp. am 19.10.2006 beginnt am 21.10.06 endet und das StartDatum von TDateline am 20.10.06 gesetzt ist. Wie zeichne ich ein halbes Item?

Oder anderes Problem wenn ein Item außerhalb des sichtbaren Bereichs von TDateLine gescrollt wird.
das Item verschwindet zwar, wird aber beim zurückscrollen nicht automatisch neugezeichnet.


Zitat von oki:
Überschreibe die procedure Paint von TDateLine und schon werden alle Items dem aktuellen DateLine automatisch angepaßt.
Iglaube da hast Du mich jetzt gerade auf den richtigen Weg gebracht.
Uwe
  Mit Zitat antworten Zitat
uwewo

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

Re: TCollection, TCollectionItem

  Alt 19. Okt 2006, 13:35
Zitat von oki:
Überschreibe die procedure Paint von TDateLine und schon werden alle Items dem aktuellen DateLine automatisch angepaßt.

Delphi-Quellcode:
    procedure Paint; override;
...

procedure TDateLine.Paint;
begin
  inherited;
  DrawItems;
end;
Leider funktioniert es so nicht, da sich das DateLine dann in einer Endlosschleife befindet.
Obwohl DrawItems nur die neue Position berechnet habe ich dann eine Prozessorauslastung von 100%.

Reagiere ich auf Veränderungen von TDateLine und rufe dann DrawItems auf, habe ich 0% Prozessorauslastung.
Uwe
  Mit Zitat antworten Zitat
oki

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

Re: TCollection, TCollectionItem

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

folgende Bemerkung hat mich etwas grübeln lassen:

Zitat von uwewo:
Leider funktioniert es so nicht, da sich das DateLine dann in einer Endlosschleife befindet.
Obwohl DrawItems nur die neue Position berechnet habe ich dann eine Prozessorauslastung von 100%.

Reagiere ich auf Veränderungen von TDateLine und rufe dann DrawItems auf, habe ich 0% Prozessorauslastung.
Das da was recursiv ist scheint klar zu sein. Das ist der normale Weg für das Zeichnen im Canvas.
Dann probier es doch mal andersrum
Delphi-Quellcode:
procedure Paint; override;
...

procedure TDateLine.Paint;
begin
  DrawItems;
  inherited;
end;
Meine Erfahrung ist, dass man einfach an zu vielen Stellen auf Änderungen reagieren muß. Da rutscht einem immer eine mit durch. Dann gibt es auch Aktionen, bei denen sich eigentlich nichts ändert, aber trozdem ein neu zeichnen notwendig wird. Da die DateItem aber nun auch wieder Controls sind müßten die entsprechende Redraw-Botschaften nach einem Verdecken (z.B. durch andere Fenster) ebenfalls erhalten.
Gut, teste mal die obere Methode und wir werden ja sehen was passiert.

Gruß oki
  Mit Zitat antworten Zitat
oki

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

Re: TCollection, TCollectionItem

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

mir ist noch was aufgefallen. in dieser Procedure
procedure TDateLine.UpdateDateLine; ein UpdateItems ist nach deinem Verfahren dann auch schon mal die halbe Miete.

Desweiteren mußt du dafür sorgen, dass nach Eigenschaftsänderungen deines Item dieses auch aktualisiert wird.
Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Procedure:  SetStartDate
  Date:        19-Okt-2006
  Arguments:  Value : TDateTime
  Result:      None
  Describtion: bei gleichen Werten ist ein Setzen unnötig und ein neu zeichnen
              (Invalidate) unerwünscht
-----------------------------------------------------------------------------}

procedure TDateItem.SetStartDate(Value : TDateTime);
begin
  if Value = FStartDate then Exit;
  FStartDate := Value;
  Invalidate;
end;
Verschiebe bitte die Function's von published in public!
Überlege, ob du für DateLine eine published-Eigenschaft StartDate anlegst. Das ist dann der erste Tag in der Anzeige.

gruß oki
  Mit Zitat antworten Zitat
uwewo

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

Re: TCollection, TCollectionItem

  Alt 20. Okt 2006, 06:41
Zitat von oki:
mir ist noch was aufgefallen. in dieser Procedure
procedure TDateLine.UpdateDateLine; ein UpdateItems ist nach deinem Verfahren dann auch schon mal die halbe Miete.
Genau hier habe ich auch angesetzt und es funktioniert auch soweit "fast" alles.


Zitat von oki:
Delphi-Quellcode:
procedure TDateItem.SetStartDate(Value : TDateTime);
begin
  if Value = FStartDate then Exit;
  FStartDate := Value;
  Invalidate;
end;
Diese proceduren existieren bereits siehe hier

Delphi-Quellcode:
procedure TDateItem.SetStartDate(Value : TDateTime);
begin
  if Value <> FStartDate then
     Begin
       FStartDate := Value;
       Invalidate;
     End;
end;

procedure TDateItem.SetStartTime(Value : TTime);
begin
  if Value <> FStartTime then
     begin
       FStartTime := Value;
       Invalidate;
     end;
end;

procedure TDateItem.SetEndDate(Value : TDateTime);
begin
  if Value <> FEndDate then
     Begin
       FEndDate := Value;
       Invalidate;
     End;
end;

procedure TDateItem.SetEndTime(Value : TTime);
begin
  if Value <> FEndTime then
     Begin
       FEndTime := Value;
       Invalidate;
     End;
end;
Werde Dir heute noch den Source per PN schicken, damit Du siehst was ich verändert habe.

Uwe
Uwe
  Mit Zitat antworten Zitat
uwewo

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

Re: TCollection, TCollectionItem

  Alt 20. Okt 2006, 07:36
Zitat von oki:
Überlege, ob du für DateLine eine published-Eigenschaft StartDate anlegst. Das ist dann der erste Tag in der Anzeige.
Das gibt es auch schon, allerdings im THeader nennt sich FirstDate, LastDate ansonsten würde mein Demo auch nicht funktionieren.

Hier übrigens mal ein Demo, nur um anderen einen Überblick zu geben über was wir hier reden.
Ich habe noch immer das Problem beim scrollen des Grids muß wohl auf eine Message vom Grid reagieren um es zu beheben.

Also keine Postings weil etwas nicht richtig gezeichnet wird

Uwe
Miniaturansicht angehängter Grafiken
screenshot_828.jpg  
Angehängte Dateien
Dateityp: exe demo_106.exe (590,0 KB, 12x aufgerufen)
Uwe
  Mit Zitat antworten Zitat
uwewo

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

Re: TCollection, TCollectionItem

  Alt 30. Okt 2006, 06:08
Hallo oki,

war die ganze Zeit geschäftlich unterwegs und hatte daher auch keine Änderungen vorgenommen.
Bin nun aber ein bißchen weiter gekommen, Problem war ich hatte die x,y Position mit CellRect ermittelt, diese Funktion gibt aber 0,0 zurück wenn die Zeile,Spalte außerhalb des sichtbaren Bereichs liegt. Habe daher mir eine eigene Funktion geschrieben.

Mausscrollrad, Scrollbars, Tasten fange ich jetzt ab um die Items gegebenenfalls zu zeichnen.

Uwe
Uwe
  Mit Zitat antworten Zitat
oki

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

Re: TCollection, TCollectionItem

  Alt 30. Okt 2006, 21:18
Hi uwewo,

leider ist meine Zeit aktuell etwas knapp, sonst hätte ich es schon ausprobiert. Ich glaube immer noch, dass es über die Paint-Procedure geht. Gut, dass du auch 'ne Zeit unterwegs bist. Vielleicht setz ich mich auch noch mal ran und Check das. Ich würde sagen, dass bei einer Änderung der DateLine Kompo, also neu zeichnen, nur die enthaltenen Kompos (DateItems) neu platziert werden müssen. So macht das doch auch jedes Fenster, dass andere Kompos als Parent hält.

Na mal schauen.

Gruß oki
  Mit Zitat antworten Zitat
uwewo

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

Re: TCollection, TCollectionItem

  Alt 6. Nov 2006, 06:24
Zitat von oki:
Ich glaube immer noch, dass es über die Paint-Procedure geht.
Dieser Satz ging mir die ganze Woche nicht aus dem Kopf, da es ja eigentlich bei jedem Objekt funktioniert. Deshalb habe ich mich am Wochenende noch einmal daran gesetzt, und folgendes herausgefunden. Meine ersten Tests hatte ich so versucht.

Delphi-Quellcode:
procedure TDateLine.Paint;
begin
  inherited;
  UpdateItems;
end;
Dabei hatte ich eine Prozessorauslastung von ca. 100%

Delphi-Quellcode:
procedure TDateLine.Paint;
begin
  inherited Paint;
  UpdateItems;
end;
bringt den gewünschten Erfolg, was so ein Wort alles ausmachen kann

Werde Dir den geänderten Source diese Woche zukommen lassen.

Bis dann

Uwe
Uwe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 14:32 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