StringGrid Text zentrieren

Rund um die LCL und andere Komponenten
Antworten
ruediger
Beiträge: 4
Registriert: Do 3. Sep 2009, 18:16

StringGrid Text zentrieren

Beitrag von ruediger »

Hallo zusammen,
bin neu bei euch.

Mein Problem mit dem Stringgrid:

ich versuche den Inhalt in den einzelnen Zellen zentriert im StringGrid auszugeben, ich bekomme doppelte Einträge.
Was mache ich falsch?

Code: Alles auswählen

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var s:String;
begin
           s:=Stringgrid1.Cells[acol,arow];
           Stringgrid1.Canvas.Brush.Color:=clRed;
           StringGrid1.Canvas.Font.Style:=[fsBold];
           StringGrid1.Canvas.Font.Size:=9;
           Stringgrid1.Canvas.FillRect(aRect);
 
           DrawText(Stringgrid1.Canvas.Handle,
             PChar(s),
             length(s),
             aRect,
             DT_Center
             or
             DT_VCenter
             or
             DT_SingleLine
           );
 
end;
Zuletzt geändert von monta am Mo 21. Sep 2009, 16:34, insgesamt 1-mal geändert.
Grund: Codetags gesetzt, sieht schöner aus.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: StringGrid Text zentrieren

Beitrag von _X_ »

Bitte den Highlighter verwenden :wink:
schau mal da :arrow: http://www.delphipraxis.net/topic162561 ... g+und.html" onclick="window.open(this.href);return false;

mfg _X_

ruediger
Beiträge: 4
Registriert: Do 3. Sep 2009, 18:16

Re: StringGrid Text zentrieren

Beitrag von ruediger »

danke.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: StringGrid Text zentrieren

Beitrag von Scotty »

Mach es nicht per length() div 2, DrawText() ist gut und richtig. Deine doppelten Einträge kommen vom Standardzeichen des Grids. Das schaltest du über DefaultDrawing=false aus.
PS: Da ist noch ein Fehler im Code: Brush.Color:=clRed; das muss Brush.Color:=clWindow heißen. Man bekommt ja schon beim Lesen des Beispiels Augenkrebs :roll:

ruediger
Beiträge: 4
Registriert: Do 3. Sep 2009, 18:16

Re: StringGrid Text zentrieren

Beitrag von ruediger »

Scotty hat geschrieben:Mach es nicht per length() div 2, DrawText() ist gut und richtig. Deine doppelten Einträge kommen vom Standardzeichen des Grids. Das schaltest du über DefaultDrawing=false aus.
PS: Da ist noch ein Fehler im Code: Brush.Color:=clRed; das muss Brush.Color:=clWindow heißen. Man bekommt ja schon beim Lesen des Beispiels Augenkrebs :roll:
Ja, für den DefaultDrawing, danke.

jetzt zu dem Augenkrebs, vollständig lautet der Code:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var s:String;
begin
s:=Stringgrid1.Cells[acol,arow];
if StringGrid1.Cells[aCol, aRow] = '5' then
begin
Stringgrid1.Canvas.Brush.Color:=clRed;
StringGrid1.Canvas.Font.Style:=[fsBold];
StringGrid1.Canvas.Font.Size:=9;
Stringgrid1.Canvas.FillRect(aRect);
end;

DrawText(Stringgrid1.Canvas.Handle,
PChar(s),
length(s),
aRect,
DT_Center
or
DT_VCenter
or
DT_SingleLine
);

end;
Mit der API Drawtext erhalte ich eine merkwürdige Ausgabe:
wenn die Bedingung erfüllt ist wird die Zelle Rot eingefärbt (Inhalt bleibt schwarz),
aber die restlichen Zellen werden Schwarz eingefärbt, der Inhalt der Zelle wird erst sichtbar, wenn ich die Zelle anklicke, dann wird die Zelle weiß und der Inhalt ist sichtbar. Weiß du wo der Fehler liegt? (danke für deine Bemühungen).

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: StringGrid Text zentrieren

Beitrag von Scotty »

Ich nehme an, du musst für die anderen Bedingungen auch sorgen.

Code: Alles auswählen

...
end else Brush.Color:=clWindow;

ruediger
Beiträge: 4
Registriert: Do 3. Sep 2009, 18:16

(gelöst) : StringGrid Text zentrieren

Beitrag von ruediger »

Scotty hat geschrieben:Ich nehme an, du musst für die anderen Bedingungen auch sorgen.

Code: Alles auswählen

...
end else Brush.Color:=clWindow;
Ich danke dir.

Antworten