Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Stringgrid und Objekte (https://www.delphipraxis.net/21612-stringgrid-und-objekte.html)

kiar 5. Mai 2004 16:26


Stringgrid und Objekte
 
mit folgendem code
Delphi-Quellcode:
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;
will ich so etwas erreichen,

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

shmia 5. Mai 2004 16:50

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:
FStatus:=pointer(Stringgrid1.objects[acol,arow]);
FStatus.Fdienst:=FGeteilterDienst; // Verboten
Also zurück an Anfang: "was willst du eigentlich erreichen ?" und
"wie soll das Grid aussehen und warum soll es so aussehen ?"

kiar 5. Mai 2004 16:59

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

shmia 5. Mai 2004 17:12

Re: Stringgrid und Objekte
 
Zitat:

Zitat von kiar
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.

Du musst die Farben ausserhalb von DrawCell setzen, dann gibts keine Probleme.
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.

kiar 5. Mai 2004 17:19

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:
TStatus = class
  FDienst : Boolean;
  FColor1 : TColor;
  FColor2 : TColor;
end;
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.

raik

Quake 6. Mai 2004 08:55

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

kiar 6. Mai 2004 09:16

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

Quake 6. Mai 2004 09:42

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:
var
  Status: TStatus;
begin
  .
  .
  Status:=TStatus.Create();              // das für jede Zelle durchführen
  Stringgrid.Objects[ACol,ARow]:=Status;
  .
  .
end;
In CellDraw kannst du dann daruf zugreifen (NUR LESEN).
Code:
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;
Du kannst dann irgend wo im Code die eigenschaften der Objekte ändern.
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?

kiar 6. Mai 2004 09:45

Re: Stringgrid und Objekte
 
ich vollidiot:

habe im
Delphi-Quellcode:
formcreate
nur ein object erstellt. natürlich wird dann Status immer überschrieben und auf den letzten stand gesetzt.

ich hoffe, das ich das nun endlich gebacken kriege,

danke shmia und quake

raik

Quake 6. Mai 2004 10:27

Re: Stringgrid und Objekte
 
Juhu, :bounce2: ich konnte auch mal jemanden weiterhelfen. :-D

ciao


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 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