![]() |
StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagieren
Hey,
ich habe eine eigene Komponente, die vom TStringGrid abgeleitet ist. Für den weiteren Gebrauch ist es wichtig, dass das Grid gleichviele Spalten und Zeilen hat. Bisher habe ich bei der entsprechenden Methode auf Gleichheit geprüft, und, wenn es nicht gleichviele waren, eine Exception geworfen. Ich fände es allerdings eleganter, beim Ändern von RowCount bzw. ColCount das entsprechend andere gleich mitzuändern. Dazu müsste ich mitbekommen, wenn eine dieser Eigenschaften geändert wird. Gibt es da irgendeine Message, auf die ich reagieren könnte o.Ä.? |
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Hallo
Warum schreibst du nicht deine eigene Prozedur wo beides geändert wird? |
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
|
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
|
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
Delphi-Quellcode:
SetColCount gibts auch. Oh je, muss das gerade ein TStringgrid sein ? Wo ist die beste Stelle das unterzubringen ? Ist CreateParams geeignet ? :gruebel: Die Grids.pas hat fast 6000 Zeilen. Da scrollt man sich ja die Flossen wund. :shock:
inherited;
FColCount := FRowCount; |
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
Damit kannst du verhindern, dass RowCount und ColCount im OI überhaupt sichtbar werden. Stattdessen gibst du ein eigenes Property (RowColCount oder GridSize) heraus. |
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
|
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Ob das immer stimmt ? :mrgreen: Habs aber doch noch gesehen wo das gemacht werden kann :
Delphi-Quellcode:
Also gilt das vorher gesagte und das ist ja dann kein Problem.
TStringGrid = class(TDrawGrid)
private ... public constructor Create(AOwner: TComponent); override; |
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
|
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
Würde es aber ein TCustomStringGrid geben, dann wäre das die richtige Lösung, denn er bräuchte dann die Properties nur veröffentlichen. Und das Veröffentlichen von Properties ist ganz einfach:
Delphi-Quellcode:
TDrawGrid = class(TCustomDrawGrid)
published property Align; // erhöhe die Sichtbarkeit von protected auf published property Anchors;// dito |
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:
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. |
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
Zitat:
Hat vielleicht jemand noch Ideen? |
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:
|
Re: StringGrid: Auf Ändern der Spalten-/Zeilenanzahl reagier
Zitat:
|
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:
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?
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. Grüße vom marabu |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 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 by Thomas Breitkreuz