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 doppelte Zeilenhöhe im Stringgrid (https://www.delphipraxis.net/34575-doppelte-zeilenhoehe-im-stringgrid.html)

Hansa 24. Nov 2004 23:43


doppelte Zeilenhöhe im Stringgrid
 
Hi,

wie kann ich gemischt einfach- und doppelthohe Zeilen in einem Stringgrid realisieren ? Geht das überhaupt ? Ich habe mal folgendes probiert :

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (StringGrid1.Row mod 2 = 0) then begin
    StringGrid1.RowHeights [ARow] := StringGrid1.DefaultRowHeight*2;
    StringGrid1.Cells [2,StringGrid1.Row] := 'doppelt hoch';
  end
  else begin
    StringGrid1.RowHeights [ARow] := StringGrid1.DefaultRowHeight;
    StringGrid1.Cells [2,StringGrid1.Row] := 'einfach hoch';
  end;
  StringGrid1.RowCount:=StringGrid1.RowCount+1;
end;
Das wirkt sich allerdings auf das gesamte Grid aus. Es werden also alle Zeilen neu gezeichnet, abwechselnd einfach und doppeltt hoch. 8)

Christian Seehase 25. Nov 2004 00:03

Re: doppelte Zeilenhöhe im Stringgrid
 
Moin Hansa,

wieso, geht doch:

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ARow mod 2 = 0 then begin
    StringGrid1.RowHeights [ARow] := StringGrid1.DefaultRowHeight*2;
  end else begin
    StringGrid1.RowHeights [ARow] := StringGrid1.DefaultRowHeight;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  iIndex: Integer;
begin
  for iIndex := 0 to StringGrid1.RowCount-1 do begin
    if iIndex mod 2 = 0 then begin
      StringGrid1.Cells [2,iIndex] := 'doppelt hoch';
    end else begin
      StringGrid1.Cells [2,iIndex] := 'einfach hoch';
    end;
  end;
end;
Du musst halt statt StringGrid1.Row ARow verwenden, da Du sonst immer den gleichen Wert abfragst, und nicht den der gerade gezeichneten Zeile.
Ausserdem solltest Du nicht im OnDrawCell einer Zelle einen Wert zuweisen, dann wird wieder neu gezeichnet.
Das flackert dann "so schön". ;-)

Wozu eigentlich

Delphi-Quellcode:
StringGrid1.RowCount:=StringGrid1.RowCount+1;
Das ist eine Endlosschleife.

Hansa 25. Nov 2004 00:53

Re: doppelte Zeilenhöhe im Stringgrid
 
Thx Christian,

sieht gut aus. Das mit dem Flackern fiel mir auch schon auf. Aber mir Deinem Code flackert eigentlich nichts. Jetzt sind aber noch folgende Fragen aufgetaucht :

1. ich kriege keine 2 Zeilen in die doppelt hohen Zellen. Das war eigentlich der Sinn des Ganzen.
2. Du legst die Spaltenhöhe bereits im FormCreate fest. Vielleicht flackert es auch deshalb nicht. Wo soll ich das am besten hinmachen, wenn die Zeilenhöhe erst zur Laufzeit feststeht ?
3. Du benutzt ja selber das OnDrawCell und nichts flackert, was jetzt ? bzw. wo geht das besser ?

Zitat:

StringGrid1.RowCount:=StringGrid1.RowCount+1;

Das ist eine Endlosschleife.
Wieso das ? :shock:

Wenn ich die rechteste Spalte verlasse, dann soll eine neue Zeile erzeugt werden und der Cursor dort in die erste Spalte wandern. So siehts richtig aus :

Delphi-Quellcode:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then begin
    case Stringgrid1.Col of
      1 : Stringgrid1.Col := 4;
      4 : begin
            Stringgrid1.Col := 1;
            Stringgrid1.RowCount := Stringgrid1.RowCount + 1;
            Stringgrid1.Row := Stringgrid1.Row + 1;
          end;
    end;
  end;
end;
Habe ich da was übersehen ?

P.S.: oh je, da habe ich noch was übersehen. 8) Geht es auch, die Zeilenhöhe in Abhängigkeit von dem eingegeben Wert in Spalte 1 zu verändern ?

Keldorn 25. Nov 2004 07:58

Re: doppelte Zeilenhöhe im Stringgrid
 
Zitat:

Zitat von Hansa
Thx Christian,

1. ich kriege keine 2 Zeilen in die doppelt hohen Zellen. Das war eigentlich der Sinn des Ganzen.

z.B drawtext verwenden (DT_wordbreak), wenn es ein ganzer Satz ist. wenn es immer 2 Zeilen sein müssen geht auch das manuelle ausgeben per textout (jede Zeile einzeln).

Zitat:

2. Du legst die Spaltenhöhe bereits im FormCreate fest. Vielleicht flackert es auch deshalb nicht. Wo soll ich das am besten hinmachen, wenn die Zeilenhöhe erst zur Laufzeit feststeht ?
das ist doch völlig egal, wo du das tust. Es ist aber sicherlich performanter, wenn du die Zeilenhöhe nur änderst, wenn das notwendig ist (Spalte wurde verkleinert, oder ein anderer Text wurde eingeben.)

Zitat:

3. Du benutzt ja selber das OnDrawCell und nichts flackert, was jetzt ? bzw. wo geht das besser ?
weil Christian den Text nicht innerhalb der Ondrawcell setzt, dann wird der text wieder gezeichnet, dort änderst du wieder den text und es muß wieder neugzeichnet werden und das geht bis in alle ewigkeit so weiter. hat christian auch schon geschrieben:
Zitat:

Zitat von christian Seehase
Ausserdem solltest Du nicht im OnDrawCell einer Zelle einen Wert zuweisen, dann wird wieder neu gezeichnet.
Das flackert dann "so schön".

Zitat:

Zitat:

StringGrid1.RowCount:=StringGrid1.RowCount+1;

Das ist eine Endlosschleife.
Wieso das ? :shock:
weil du jedesmal, wenn ondrawcell aufgerufen wird, die eine Zeile hinzugefügt wird. versteh sowieso nicht, was du hier vorhast. 3x im grid gescrollt und der Nutzer hat ein haufen leere Zeilen im grid :roll:.

Mfg Frank

Christian Seehase 25. Nov 2004 21:28

Re: doppelte Zeilenhöhe im Stringgrid
 
Moin Hansa,

Zitat:

Zitat von Hansa
Geht es auch, die Zeilenhöhe in Abhängigkeit von dem eingegeben Wert in Spalte 1 zu verändern ?

na sicher geht das.

Angenommen Du willst drei verschiedene Zeilenhöhen in Abhängigkeit des Wertes der ersten Spalte (mögliche Werte 1, 2 oder 3):

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

const // Array der Zeilenhöhen
  _aiRowHeight : array [0..2] of integer = (10,20,30);

begin
  // Je nachdem, was in Spalte 1 (Index = 0) steht, wird die Zeile jetzt 10, 20 oder 30 Pixel hoch
  (Sender as TStringGrid).RowHeights[ARow] := _aiRowHeigth(StrToIntDef(Sender as TStringGrid).Cells[0,ARow],0) mod 3);
end;

Hansa 25. Nov 2004 22:47

Re: doppelte Zeilenhöhe im Stringgrid
 
Oh je, es wird immer komplizierter. Aber wenn wir schon dabei sind mit dem Zeichnen. Wie sieht das ganze im Zusammenhang mit einem Icon aus ?

Also in einer Zeile ein Icon einbauen. Ich weiß, daß das geht, aber auch in diesem Zsammenhang ?


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