![]() |
Stringgrid und Objekte
mit folgendem code
Delphi-Quellcode:
will ich so etwas erreichen,
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var Rect1, Rect2 :TRect; s ,s1:string; begin s :='Hallo'; s1:=' Welt'; if gdfixed in state then exit; with stringgrid1 do begin if cells[Acol,arow] <> '' then begin If not FGeteilterDienst then begin Rect1:=CellRect(Acol,Arow); Canvas.Fillrect(Rect1); drawText(canvas.Handle, Pchar(s),length(s), Rect, dt_singleline or dt_center or dt_VCenter) end else begin FStatus:=pointer(Stringgrid1.objects[acol,arow]); FStatus.Fdienst:=FGeteilterDienst; Rect1:=CellRect(Acol,arow); FStatus.FRect1Color:=zeigeFarbe; Canvas.Brush.Color:=TColor(FStatus.FRect1Color); Canvas.Fillrect(Rect1); drawText(Canvas.Handle, Pchar(s), length(s), Rect1, Dt_Center); Rect2:=cellrect(acol,arow); Rect2.Left:= Rect1.left; Rect2.top := Rect1.top+ RowHeights[Arow] div 2; FStatus.FRect2Color:=zeigeFarbe1; Canvas.Brush.Color:=TColor(FStatus.FRect2Color); Canvas.FillRect(Rect2); Drawtext(Canvas.Handle, Pchar(s1), length(s1), Rect2, DT_Center or DT_Wordbreak); end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var s:String; begin if FgeteilterDienst then s:= 'Hallo' +#13#10 + 'Welt' else s:= 'Hallo'; with Stringgrid1 do begin Cells[Col, Row]:=s; Objects[Col, Row]:=FStatus; end; end; das die zellen zweifarbig dargestellt werden. das funktioniert so weit. wenn ich jetzt aber invalidate mache wird nur der status der letzten einstellung übernommen. wie kriege ich das nun gebacken, das der status der jeweiligen zelle aufgerufen wird. raik |
Re: Stringgrid und Objekte
Du darfst innerhalb von DrawCell weder den Inhalt von StringGrid.Cells[] noch
StringGrid.Objects[] verändern (da du nicht kontrollieren kannst wie oft DrawCell aufgerufen wird) ! Aber genau das scheinst du zu tun:
Delphi-Quellcode:
Also zurück an Anfang: "was willst du eigentlich erreichen ?" und
FStatus:=pointer(Stringgrid1.objects[acol,arow]);
FStatus.Fdienst:=FGeteilterDienst; // Verboten "wie soll das Grid aussehen und warum soll es so aussehen ?" |
Re: Stringgrid und Objekte
Liste der Anhänge anzeigen (Anzahl: 1)
hallo ,
so wie im anhang sollte es aussehen, ziel ist es verschiedene dienste in verschiedenen bereichen aufzuteilen, zur übersicht,sollten die hintergründe farbig den bereichen zugeordnet werden. wenn die form sich wieder neu zeichnet, nimmt sie den letzten zustand von FStatus an.ich müsste in abhängingkeit von der zelle den status abrufen. raik |
Re: Stringgrid und Objekte
Zitat:
Also brauchst du eine Methode, die .Objects[].FRect1Color und .Objects[].FRect2Color richtig setzt. (Diese Methode muss die Abfolge der Zellen kennen; immer diagonal ?) Bei FGeteilteDienst=True werden diese Farben beachtet, ansonsten nicht. |
Re: Stringgrid und Objekte
hallo shmia,
das muss nicht diagonal sein, es könnte bunt gemischt sein oder uni, deshalb ist FGeteilterDienst drin. das object erstelle ich wie folgt
Delphi-Quellcode:
das ist mein objekt. ich hatte auch schon einen counter der mir die Objekte zählte, aber ich kam nicht darauf diesen mit Objects vom grid zu verbinden.
TStatus = class
FDienst : Boolean; FColor1 : TColor; FColor2 : TColor; end; raik |
Re: Stringgrid und Objekte
Möchtest du dir Farbe abhänig vom Zellinhalt haben oder möchtest du die Farbe belibig an einer anderen Stelle festlegen?
ciao |
Re: Stringgrid und Objekte
die farbe wird an anderer stelle erstellt, sie wird über einen dialog ausgewählt.
das ist nicht das problem. ich weis bloß noch nicht, wie ich mein FStatus dem Stringgrid Object zuordnen kann? raik |
Re: Stringgrid und Objekte
Ich habe mal einem StringGrid Objekte zugeordnet. Dazu habe ich dynamisch für jede Zelle das Object erzeugt. Wenn du z.B 100 Zellen hast, musst du auch 100 deiner TStatus Objekte erstellen die dann im Speicher liegen. Beim erstellen der Objekte diese natürlich deinen Zelle zuordnen.
so z.B.
Code:
In CellDraw kannst du dann daruf zugreifen (NUR LESEN).
var
Status: TStatus; begin . . Status:=TStatus.Create(); // das für jede Zelle durchführen Stringgrid.Objects[ACol,ARow]:=Status; . . end;
Code:
Du kannst dann irgend wo im Code die eigenschaften der Objekte ändern.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var Status: TStatus; Farbe: Tcolor; begin . . Status:=StringGrid.Objects[ACol,ARow]; Farbe:=Status.Fcolor1; . . end; Wenn du zur Laufzeit Neue Zellen erstellst musst du nur weitere Objekte erstellen und wenn du Zeilen löschste gebe sie frei mit Status.Free. Meinst du das? Hilft dir das weiter oder habe ich dich immer noch nicht richtig verstanden? |
Re: Stringgrid und Objekte
ich vollidiot:
habe im
Delphi-Quellcode:
nur ein object erstellt. natürlich wird dann Status immer überschrieben und auf den letzten stand gesetzt.
formcreate
ich hoffe, das ich das nun endlich gebacken kriege, danke shmia und quake raik |
Re: Stringgrid und Objekte
Juhu, :bounce2: ich konnte auch mal jemanden weiterhelfen. :-D
ciao |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz