Delphi-PRAXiS
Seite 1 von 2  1 2      

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-Zellen rechtsbündig (https://www.delphipraxis.net/146929-stringgrid-zellen-rechtsbuendig.html)

Hansa 29. Jan 2010 15:12


Stringgrid-Zellen rechtsbündig
 
Hi,

ich habe hier ein abgeleitetes Stringgrid. Es geht da u.a. um Zellenformatierung. Reals sollen direkt autom. Nachkommastellen haben usw. Momentan sieht das so aus :

Delphi-Quellcode:
procedure TExtStringGrid.SetCellReal(ACol, ARow: integer;
  const Value: real);
begin
  FCellReal := Value;
  Cells [ACol,ARow] := FloatToStrF(FCellReal,ffFixed,8,2);
end;
Damit kann ich also statt Cells [x,y] einfach CellReal [x,y] aufrufen und fertig. Die Zellen sind allerdings dann nicht rechtsbündig. Aktuell habe ich dafür noch eine Prozedur, die im DrawCell aufgerufen wird :

Delphi-Quellcode:
procedure sgRechts (Sender: TObject; Rect: TRect; ACol, ARow:Integer);
var st: String;
begin
  with Sender as TExtStringGrid do begin
    Canvas.FillRect(Rect);
    st := Cells[ACol,ARow];
    DrawText(Canvas.Handle, PChar(st), StrLen(PChar(st)),Rect,DT_RIGHT);
  end;
end;
Wie kriege ich diese Prozedur sgRechts nun direkt der Komponente beigebracht ? Da gibts ja so kein Rect etc.

Question_mark 29. Jan 2010 15:47

Re: Stringgrid-Zellen rechtsbündig
 
Hallo,

Zitat:

Zitat von Hansa
Wie kriege ich diese Prozedur sgRechts nun direkt der Komponente beigebracht ?

Mal ganz spontan mein erster Gedanke dazu :

Den InplaceEditor von TStringGrid überschreiben bzw ersetzen ?

Gruß

Question_mark

Hansa 29. Jan 2010 17:52

Re: Stringgrid-Zellen rechtsbündig
 
Es geht nur um die Ausgabe des Grids, also die Anzeige.

mkinzler 29. Jan 2010 17:53

Re: Stringgrid-Zellen rechtsbündig
 
Mal doch selber

Hansa 29. Jan 2010 19:24

Re: Stringgrid-Zellen rechtsbündig
 
Werde ich nicht tun. Fange gewiss noch an den Bildschirm anzustreichen. :mrgreen: Die Komponente soll lediglich das integriert machen, was die externe Prozedur macht. Wer weiss mehr ?

s-off 29. Jan 2010 19:32

Re: Stringgrid-Zellen rechtsbündig
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

ich hatte vor einiger Zeit mal begonnen, eine eigene Grid-Komponente abzuleiten, habe dann allerdings irgendwann nicht mehr weitergemacht.
Ich habe die Unit sowie eine Testanwendung mal angehängt. Ob Du die Testanwendung linken kannst, musst Du mal schauen - ist wie gesagt schon ein paar Tage her - vielleicht kannst Du ja etwas davon gebrauchen.

Noch etwas zu der Testanwendung:
Alle Funktionen sind über das Kontextmenü und die Toolbar zugänglich. Fast alle Funktionen lassen sich nur dann ausführen, wenn eine Zelle 'spezialisiert' ist. Du musst also erst eine Zelle über das Kontextmenü 'spezialisieren' - doofer Ausdruck, ich weiß...
Wenn Du also die Ausrichtung einer Zelle ändern willst, musst Du sie erst spezialisieren, dann die Ausrichtung oben in der Toolbar einstellen, und dann über das Kontextmenü die Ausrichtung für die aktive Zelle setzen. Das lässt sich natürlich auch einfacher implementieren, aber das ist wie gesagt nur eine Anwendung, um alle Funktionalitäten zu testen.

Edit: ich hatte irgendwann mal angefangen, die Kommentare ins Englische zu übersetzen - aber wie gesagt, nur angefangen! Also nicht wundern, wenn es irgendwann wieder deutsch wird - aber Hauptsache überhaupt kommentiert ;)

Wolfgang Mix 3. Mär 2010 18:40

Re: Stringgrid-Zellen rechtsbündig
 
Ich habe hier einen Codeschnippsel gefunden, mit dem man die Zellen linksbündig, zentriert oder
rechtsbündig formatieren kann und den Code auf Rechtsbündigkeit gekürzt.

Delphi-Quellcode:
//http://www.delphi-forum.de
//procedure WriteTextAligned und
//procedure TForm1.StringGrid1DrawCell
procedure WriteTextAligned(Canvas: TCanvas; Rect: TRect; Alignment: TAlignment; Text: string);
var xPos, yPos: integer;
begin
xPos := Rect.Left + 2; // Standard verhalten
yPos := Rect.Top + 2; // Standard verhalten
with Canvas do
  begin
    xPos := Rect.Left + (Rect.Right - Rect.Left - TextWidth(Text) - 2);
    TextRect(Rect, xPos, yPos, Text);
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
begin
  // Alle Spalten rechtsbündig
  WriteTextAligned(TStringGrid(Sender).Canvas, Rect, taRightJustify, TStringGrid(Sender).Cells[Acol, ARow]);
end;
Ich denke, das können andere auch gebrauchen ...

DeddyH 3. Mär 2010 18:48

Re: Stringgrid-Zellen rechtsbündig
 
Nunja, mit DrawText (siehe Ausgangspost) ist das einfacher gemacht, dazu müsste es auch diverse Beispiele in der DP geben.

Wolfgang Mix 3. Mär 2010 18:56

Re: Stringgrid-Zellen rechtsbündig
 
@Detlef
Danke für den Tipp, muss ich ausprobieren.

Hansa 14. Mär 2010 16:18

Re: Stringgrid-Zellen rechtsbündig
 
Habe das mal wieder in Angriff genommen. Und zwar so :

Delphi-Quellcode:
procedure TExtStringGrid.SetCellInteger(ACol, ARow: integer;
  const Value: integer);
var st : string;
    Rect : TRect;
begin
  FCellInteger := Value;
  Cells [ACol,ARow] := IntToStr(value);
  Rect := CellRect(ACol,ARow);
  Canvas.FillRect(Rect);
  st := 'Test';
  InflateRect(rect,-2,-2);
  DrawText(Canvas.Handle, PChar(st), StrLen(PChar(st)),Rect,DT_RIGHT);
end;
Ergebnis : Nichts ! Ab der Zeile :
Delphi-Quellcode:
Cells [ACol,ARow] := IntToStr(value);
tut sich offensichtlich nichts mehr. Der übergebene Zahlenwert steht in den Zellen. Die Rect-Koordinaten stimmen, aber von 'Test' ist absolut nichts zu sehen. Was ist da falsch ? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr.
Seite 1 von 2  1 2      

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