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

Wolfgang Mix 14. Mär 2010 16:31

Re: Stringgrid-Zellen rechtsbündig
 
Delphi-Quellcode:
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;
Aktiviere mal das Ereignis OnDrawCell im Objektinspektor und setze dann den
obigen Code ein. So geht es bei mir.

s-off 14. Mär 2010 18:25

Re: Stringgrid-Zellen rechtsbündig
 
Hast Du Dir mal die von mir gepostete Unit angesehen?

Hansa 14. Mär 2010 18:46

Re: Stringgrid-Zellen rechtsbündig
 
Zitat:

Zitat von s-off
Hast Du Dir mal die von mir gepostete Unit angesehen?

Ja sicher. Nichts für ungut, aber das passt nicht recht in mein Konzept. Wenn das mit dem OnDrawCell mir auch nicht gefällt : gehen tuts ja schon.

Das, was die Prozedur :

Delphi-Quellcode:
WriteTextAligned
im Prinzip macht, das macht bei mir die Prozedur sgRechts und die wird im OnDrawCell des Grids aufgerufen (noch). Siehe #1.

Darum gehts aber nicht. Es geht darum diese Eigenschaft dem Stringgrid beizubringen. An Source gibts kaum mehr was zu zeigen. Der Vollständigkeit halber :

Delphi-Quellcode:
TExtStringGrid = class(TStringGrid)
  private
    FCellInteger : integer;
...
  public
     property CellInteger[ACol, ARow : integer] : integer read GetCellInteger write SetCellInteger;
end;
...
function TExtStringGrid.GetCellInteger(ACol, ARow: integer): integer;
begin
  GetCellInteger := FCellInteger;
end;
Rest siehe #1. Ich kann ja auch den Stringgrid-Zellen ohne große Umwege direkt Zahlenwerte übergeben. Das geht ja alles. Aber ich kriege die Zellwerte (sofern numerisch) eben nicht dazu, dass sie rechtsbündig in den Zellen stehen. Außer ich gehe bei jedem Grid hin und behandele das im OnDrawCell. Langsam wird das OnDrawCell unübersichtlich. Man schaue sich das mal an :

Delphi-Quellcode:
procedure Tfrm.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const IsChecked : array[Boolean] of Integer =
      (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var DrawState: Integer;
begin
  inherited;
  if (ARow >= sgArtNr.FixedRows) and (ACol >= sgArtNr.FixedCols) then with sgArtNr do begin
    if (ACol in KommaCols) then
      sgKommaRechts(sgArtNr, Rect, ACol, ARow)
    else if (ACol in RechtsCols + ZahlenCols + MinusCols) then
      sgRechts(sgArtNr, Rect, ACol, ARow)
    else if (ACol in CheckBoxCols) then
      sgZentriert(sgArtNr, Rect, ACol, ARow);
    EditObject := TEditObject (Objects [ACol,ARow]);

... noch über 100 Zeilen
end;
Das muss langsam mal 1. entflechtet, übersichtlicher und 2. wartbarer gemacht werden. Denn obwohl ich schon beim Bestücken der Zellen weiss, wie die formatiert werden sollen, ob es integer, real oder sonstwas ist, gehe ich momentan über den Umweg der Spaltennummern.


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