Delphi-PRAXiS
Seite 2 von 2     12   

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: Auf Ändern der Spalten-/Zeilenanzahl reagieren (https://www.delphipraxis.net/115188-stringgrid-auf-aendern-der-spalten-zeilenanzahl-reagieren.html)

Hansa 7. Jun 2008 17:48

Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
 
Grundsatz der OOP : immer möglichst viel vom Vorgänger erben. Die Custom-Dinger sind dafür gedacht einem Komponentenentwickler zumindest mal die Namen der Methoden zu ersparen. Er hat ein fast leeres Grundgerüst und muss dann alles selber machen. Beim Stringgrid siehts z.B. so aus :

Zitat:

{ TCustomGrid is an abstract base class that can be used to implement
general purpose grid style controls. The control will call DrawCell for
each of the cells allowing the derived class to fill in the contents of
the cell. The base class handles scrolling, selection, cursor keys, and
scrollbars.
Außer ein bisschen Tastatureingaben, Scrollbars usw. ist also nichts fertig.

Das hier ist aber noch viel schlimmer. FColCount ist private deklariert. Es besteht also keine Chance, von dem abgeleiteten Stringgrid aus da dranzukommen. Zumindest nicht ohne Eingriffe im VCL-Quelltext. Vielleicht sieht irgendeiner in den 6000 Zeilen noch irgendeine Möglichkeit. Ich jedenfalls nicht.

Das geht wohl nur über Umwege.

Fussball-Robby 7. Jun 2008 18:11

Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
 
Zitat:

Zitat von Hansa
Delphi-Quellcode:
inherited;
FColCount := FRowCount;

Zitat:

Zitat von Hansa
Habs aber doch noch gesehen wo das gemacht werden kann :

Delphi-Quellcode:
  TStringGrid = class(TDrawGrid)
  private
...
  public
    constructor Create(AOwner: TComponent); override;
Also gilt das vorher gesagte und das ist ja dann kein Problem.

Alco im Create FColCount := FRowCount? Das Create wird aber schon aufgerufen, wenn die Komponente auf die Form kommt, danach kann man das noch ändern, wie man will. Ich muss irgendwie mitbekommen, wenn RowCount/ColCount geändert wird, und in der Grids.pas werd ich einfach nicht fündig :wall:
Hat vielleicht jemand noch Ideen?

Hansa 7. Jun 2008 18:23

Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
 
Ich sehe nur noch Einführung einer HilfsRow / HilfsCol und da die Werte direkt an ColCount/RowCount übergeben. Oder den Einsatz der Objektablage. D.h. Vererbung auf Form-Ebene. In der Urform müsste dann nur im FormCreate RowCount := ColCount gemacht werden. Und dann eben von dieser Form ableiten, anstatt mit neu -> Form über neu -> weitere -> MeineForm. Das hätte noch den positiven Nebeneffekt, dass man so auch alle Grundeinstellungen/Ereignisse schon in der Urform abhandeln könnte. Die letzte Möglichkeit : auf Lannes warten. Der ist hier für Stringgrids zuständig. :shock: Hexen kann der AFAIK allerdings auch nicht. :mrgreen:

Fussball-Robby 7. Jun 2008 18:28

Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
 
Zitat:

Zitat von Hansa
Ich sehe nur noch Einführung einer HilfsRow / HilfsCol und da die Werte direkt an ColCount/RowCount übergeben.

Sowas wollte ich eigentlich vermeiden, aber das ist im Moment wohl das einfachste. Wenn ich aber eine Hilfsproperty mache, kann man die anderen trotzdem noch ändern. Gibt es eine Möglichkeit, die Sichtbarkeit der Propertys runterzusetzen, sodass sie nicht mehr im OI sind?

marabu 7. Jun 2008 18:46

Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
 
Hallo Robert,

Sichtbarkeiten kannst du nicht verringern, nur erweitern.

Über eine Redimensionierung deines Grids informiert dich die dafür vorgesehene Methode SizeChanged():

Delphi-Quellcode:
unit MoreGrids;

interface

uses
  SysUtils, Classes, Controls, Grids;

type
  TStringGridEx = class(TStringGrid)
  protected
    procedure SizeChanged(OldColCount, OldRowCount: Longint); override;
  end;

procedure Register;

implementation

procedure TStringGridEx.SizeChanged(OldColCount, OldRowCount: Longint);
begin
  inherited SizeChanged(OldColCount, OldRowCount);
  // ...
end;

procedure Register;
begin
  RegisterComponents('marabu', [TStringGridEx]);
end;

end.
Wenn du selbst die Dimensionen des Grids änderst, hast du doch die volle Kontrolle - auch zur Laufzeit. Worüber also zerbrichst du dir denn da den Kopf?

Grüße vom marabu

Fussball-Robby 7. Jun 2008 18:58

Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
 
Perfekt, SizeChanged ist genau das richtige! Danke :cheers:
Delphi-Quellcode:
  inherited SizeChanged(OldColCount, OldRowCount);
  if OldColCount <> ColCount then
    RowCount := ColCount
  else
  if OldRowCount <> RowCount then
    ColCount := RowCount;
Zitat:

Wenn du selbst die Dimensionen des Grids änderst, hast du doch die volle Kontrolle - auch zur Laufzeit. Worüber also zerbrichst du dir denn da den Kopf?
Wenn ich aber aus Versehen z.B. 20 Reihen und nur 19 Spalte habe und es nicht rechtzeitig bemerke, kommt bei der Berechnung, die dann läuft, nachher nutzloses Zeugs raus. Und anstelle vor der Berechnung einen Fehler auszugeben, fand ich es komfortabler, die Sache an der Wurzel zu packen :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz