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 Borland D7 > Stringgridkompo aendern (https://www.delphipraxis.net/26552-borland-d7-stringgridkompo-aendern.html)

richard_boderich 25. Jul 2004 09:23


Borland D7 > Stringgridkompo aendern
 
Tachchen Leutz,

ich hatte mal ne frage. die delphi vcl kompos sind doch mit delphi selbst erstellt worden.
da das dähmliche grid immer linksbuendig zeichnet, will ich die kompo so abaendern, das
das verdammte ding den text IMMER zentriert zeichnet!!! mein problem ist, das
meine bildschirmausgabe zeitkritisch ist, und das grid ja jedesmal zweimal gezeichnet muss.

1. um die daten zu aktualisieren

und

2. um den text zu zentrieren

koennte mir vorstellen, das dat irre performance kostet

PS: Ist denn das ueberhaupt so ? :gruebel:

mein prob ist , das ich mir grad den quelltext von grids.pas angeschaut hab, und da nicht durchblick

in meinen delphiprogs verwende ich folgende routine zur zentrierung

Delphi-Quellcode:
procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var s: string;
begin
  if (Sender IS TStringGrid) then // Nur zur Sicherheit
  begin
    s := (Sender As TStringGrid).Cells[ACol, ARow]; // Text der Zelle holen
    (Sender As TStringGrid).Canvas.FillRect(Rect); // Zelle leer überzeichnen
    DrawText((Sender As TStringGrid).Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_Center or DT_VCENTER); // Text zentriert zeichnen
  end;
end;
in der komposource verwenden die aber, wenn ich das richtig sehe, nicht drawtext sondern textrect zur ausgabe??

2. frage was macht der schalter "default Drawing" bei stringgrids, als ich den false gesetzt hatte, sah mein grid eine wenig
anders aus, aber es gingen verschiedene ereignisse nicht mehr > z. b onselectcell

3. was gibt der parameter State: im obige listing an ?

danke schon mal im vorraus, den ueblichen verdächtigen :zwinker:

Keldorn 25. Jul 2004 09:52

Re: Borland D7 > Stringgridkompo aendern
 
Zitat:

koennte mir vorstellen, das dat irre performance kostet
es werden bei ondrawcell nur die Zellen neu gezeichnet, wo es erforderlich ist. Du zeichnest also immer nur einen ausschnitt, nie das ganze grid mit einmal.

Zitat:

in der komposource verwenden die aber, wenn ich das richtig sehe, nicht drawtext sondern textrect zur ausgabe
du kannst auch mit textout/textrect einen text zentriert darstellen, du mußt die dann den zeichenpunkt selbst ausrechnen, drawtext ist da eleganter.

Wenn du möchstest, das dein grid immer den text zentriert darstellt: gegen die Verwednung des ondrawcell ereignisses spricht nichts, du kannst dir natürlich auch eine eigene Komponente vom stringgrid ableiten und dort das ondrawcellereignis überschreiben.

Zitat:

2. frage was macht der schalter "default Drawing" bei stringgrids,
...
3. was gibt der parameter State: im obige listing an ?
Mit einem druck auf die F1-taste wärst du schneller gewesen :roll:

Mfg Frank

richard_boderich 25. Jul 2004 10:08

Re: Borland D7 > Stringgridkompo aendern
 
@ keldorn,

beim mir werden jedesmal alle zellen neu geschrieben,
und das grid wird meiner meinung nach doch 2. mal gezeichnet,
denn wenn ich meine ondrawcell ereignis deaktiviere mit ondrawcell := nil
geht die ausgabe viel fluessiger von statten

bemerkung : ich meinte das die zellen alle 2 mal gezeichnet werden muessen, nicht das komplette grid !

im uebrigen muss ich 2 x 1439 werte andern, da ich seitenweise scrolle

Keldorn 25. Jul 2004 10:18

Re: Borland D7 > Stringgridkompo aendern
 
Das setzen von werten hat nicht automatisch ein neuzeichnen der Zelle zur Folge. Neugezeichnet wird die zelle nur, wenn sie im sichtbaren bereich liegt.

füge beim ondrawcell z.B. sowas ein
Delphi-Quellcode:
listbox1.Items.add('col:'+inttostr(acol)+'row:'+inttostr(arow));
und wenn du dann z.B. neue werte setzt
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  stringgrid1.cells[1,1]:='Test';
  stringgrid1.cells[2,2]:='Test';
  stringgrid1.cells[3,3]:='Test';
  stringgrid1.cells[4,4]:='Test';
  stringgrid1.cells[5,5]:='Test';
end;
dann werden auch nur diese 5 Zellen gezeichnet, wenn sie im sichtbaren bereich liegen.

Zitat:

beim mir werden jedesmal alle zellen neu geschrieben,
und das grid wird meiner meinung nach doch 2. mal gezeichnet,
woher weißtz du das? verwendest du noch irgendwo repaint etc?

Zitat:

bemerkung : ich meinte das die zellen alle 2 mal gezeichnet werden muessen, nicht das komplette grid !
ich verstehe nicht, was du damit sagen willst.

richard_boderich 25. Jul 2004 10:42

Re: Borland D7 > Stringgridkompo aendern
 
@ keldorn,

bei mir sind alle zellen sichbar !!!!
deswegen zeichnet das grid auch zweimal

bei ersten internen aufruf von ondrawcell aktualisiert das grid die zellen, und zeichnet linksbuendig,
danach wird doch erst mein ondrawcell aufgerufen,das die zellen zentriert zeichnet oder ???

bitte korrigiert mich falls dat nicht stimmt

Sharky 25. Jul 2004 11:45

Re: Borland D7 > Stringgridkompo aendern
 
Hai richard,

da ich dein Projekt ja kenne weis ich ja auch das immer alles neu gezeichnet wird (es geht um die Anzeige in einem HEX-Editor).

Was ich mir vorstellen kann ist das das Zentrieren einfach viel länger dauert als das linkbündig zeichnen. Es muss ja jedesmal erst berechnet werden wo der Text stehen soll. Teste doch einmal wie die Performanc bei deiner OnDrawCell ist wenn Du den Text linksbündig ausgeben lässt.


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