![]() |
Möchte StringGrid für verschiedene Typen (Variablenformate)
Hallo,
habe irgend wie eine Blockade, ich will eine eigene Komponente abgeleitet von TStringGrid erzeugen, in die ich gleich alle Zahlenformate hineinschreiben kann (ohne immer vorher FloatToStr oder IntToStr machen zu müssen). Für TEdit habe ich das schon gemacht, das ging ganz leicht. Aber bei TStringGrid habe ich irgendwie das Problem mit den ZellIndices. Jedenfalls meckert der Kompiler immer über inkompatible Typen. Hier schnell mal der Komponenten-Code:
Delphi-Quellcode:
Ob ich in den markierten Zeilen die Parameterliste weglasse oder nicht immer kommt die Fehlermeldung Inkompatible Typen
unit EBStringGrid2;
interface uses SysUtils, Classes, Controls, Grids; type TEBStringGrid2 = class(TStringGrid) private FCellInte: Integer; FCellPCentX: single; FCellFloat2: single; FCellPCent2: single; FCellPCent1: single; FCellFloatX: single; FCellPCent3: single; FCellFloat4: single; FCellFloat3: single; FCellFloat1: single; procedure SetCellFloat1(const Value: single;i,j:integer); procedure SetCellFloat2(const Value: single;i,j:integer); procedure SetCellFloat3(const Value: single;i,j:integer); procedure SetCellFloat4(const Value: single;i,j:integer); procedure SetCellFloatX(const Value: single;i,j:integer); procedure SetCellInte(const Value: Integer;i,j:integer); procedure SetCellPCent1(const Value: single;i,j:integer); procedure SetCellPCent2(const Value: single;i,j:integer); procedure SetCellPCent3(const Value: single;i,j:integer); procedure SetCellPCentX(const Value: single;i,j:integer); { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property CellFloatX:single read FCellFloatX write SetCellFloatX(i,j:integer); //*in dieser Zeile property CellFloat1:single read FCellFloat1 write SetCellFloat1(i,j:integer); // kommt die property CellFloat2:single read FCellFloat2 write SetCellFloat2(i,j:integer); // Fehlermeldung property CellFloat3:single read FCellFloat3 write SetCellFloat3(i,j:integer); property CellFloat4:single read FCellFloat4 write SetCellFloat4(i,j:integer); property CellPCentX:single read FCellPCentX write SetCellPCentX(i,j:integer); property CellPCent1:single read FCellPCent1 write SetCellPCent1(i,j:integer); property CellPCent2:single read FCellPCent2 write SetCellPCent2(i,j:integer); property CellPCent3:single read FCellPCent3 write SetCellPCent3(i,j:integer); property CellInte:Integer read FCellInte write SetCellInte(i,j:integer); end; procedure Register; implementation { TEBStringGrid2 } procedure TEBStringGrid2.SetCellFloat1(const Value: single;i,j:integer); begin FCellFloat1 := roundTo(Value,-1); Cells[i,j]:=FloatToStr(FCellFloat1); end; procedure TEBStringGrid2.SetCellFloat2(const Value: single;i,j:integer); begin FCellFloat2 := roundTo(Value,-2); Cells[i,j]:=FloatToStr(FCellFloat2); end; procedure TEBStringGrid2.SetCellFloat3(const Value: single;i,j:integer); begin FCellFloat3 := roundTo(Value,-3); Cells[i,j]:=FloatToStr(FCellFloat3); end; procedure TEBStringGrid2.SetCellFloat4(const Value: single;i,j:integer); begin FCellFloat4 := roundTo(Value,-4); Cells[i,j]:=FloatToStr(FCellFloat4); end; procedure TEBStringGrid2.SetCellFloatX(const Value: single;i,j:integer); begin FCellFloatX := Value; Cells[i,j]:=FloatToStr(FCellFloatX); end; procedure TEBStringGrid2.SetCellInte(const Value: Integer;i,j:integer); begin FCellInte := Value; Cells[i,j]:=IntToStr(FCellInte); end; procedure TEBStringGrid2.SetCellPCent1(const Value: single;i,j:integer); begin FCellPCent1 := roundTo(100*Value,-1); Cells[i,j]:=FloatToStr(FCellPCent1); end; procedure TEBStringGrid2.SetCellPCent2(const Value: single;i,j:integer); begin FCellPCent2 := roundTo(100*Value,-2); Cells[i,j]:=FloatToStr(FCellPCent2); end; procedure TEBStringGrid2.SetCellPCent3(const Value: single;i,j:integer); begin FCellPCent3 := roundTo(100*Value,-3); Cells[i,j]:=FloatToStr(FCellPCent3); end; procedure TEBStringGrid2.SetCellPCentX(const Value: single;i,j:integer); begin FCellPCentX := 100*Value; Cells[i,j]:=FloatToStr(FCellPCentX); end; procedure Register; begin RegisterComponents('EB_Tools', [TEBStringGrid2]); end; end. Mir fehlt hier irgendwie die Phantasie, wie ich das mit den Cell-Indices i, j hinbekommen kann. Danke für Hilfe E. B. |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Moin EccoBravo,
lass bei den Properties einfach die Parameterliste weg. Die Parameter stehen ja weiter oben in der Deklaration. [EDIT] Vergiss mein dummes Geschwätz von Eben. Wie hast Du denn die Deklarationen unter Private gemacht? Schreib Dir die Property-Deklaration hin:
Delphi-Quellcode:
Drücke STRG-SHIFT-C.
property CellFloatX[ACol, ARow : integer] : single read GetCellFloatX write SetCellFloatX;
Die restlichen Deklarationen werden automatisch erstellt, inklusive der Methodenrümpfe. Du kannst natürlich auch zuerst alle Properties nach obigem Muster erstellen, und dann alle restlichen Deklarationen automatisch erstellen lassen. [/EDIT] |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Hallo Chris,
danke, aber dann kommt der Fehler auch. Grüße E. B. |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Wenn man versucht, einen Integer mit FloatToStr in einen String umzuwandeln, dann darf man sich nicht wundern. :mrgreen:
Edit : Zeile 87 |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Hallo Cris,
Das war eine gute Idee es so zu machen, aber trotzdem noch Fehlermeldung [Fehler]EBStringGrid2.pas..Published-Eigenschaft'CellFloatX' kann nicht vom Type ARRAY sein ... trotzdem vielen Dank E.B. |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Warum PUBLISHED? Du möchtest die Zellen des Grids doch nicht im Objektinspektor bearbeiten, oder? Verschiebe die Deklarationen einmal in den PUBLIC-Teil des Objekts.
Gruß Hawkeye |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Was ist mit meinem Einwand ? Wird einfach ignoriert. :thumb: Dann erzähle wenigstens vorher, daß zwar der geschilderte Fehler an der gesagten Stelle auftaucht, aber noch ca. 30 weitere danach kommen. :evil: Habe schnell mal den Code reduziert.
Hiermit kommen die besagten Fehler nun nicht mehr :
Delphi-Quellcode:
Alleine in der reduzierten Fassung waren vorher 5 Fehler auszubessern. Der Code hier wird sich compilieren lassen. Er nützt aber nichts, wegen des
unit TestUnit2;
interface uses SysUtils, Classes, Controls, Grids; type TEBStringGrid2 = class(TStringGrid) procedure SetCellFloatX(const Value: real); private FCellFloatX: real; protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property CellFloatX:real read FCellFloatX write SetCellFloatX; //*in dieser Zeile end; procedure Register; implementation { TEBStringGrid2 } procedure TEBStringGrid2.SetCellFloatX(const Value: real); begin FCellFloatX := Value; Cells[1,1]:=FloatToStr(FCellFloatX); end; procedure Register; begin RegisterComponents('EB_Tools', [TEBStringGrid2]); end; end.
Delphi-Quellcode:
Steht da i,j wie vorher, dann wird der Compiler da hängenbleiben. Also muß man ihm sagen was das soll. Mir ist zwar ziemlich klar, wie das gehen soll, aber muß wirklich jede einzelne Zelle einzeln behandelt werden ? Kann man das nicht auf die Cols beschränken ?
Cells [1,1]
wg. roter Kasten : Ja, ähnliche Überlegung. Aber nützt das was im public ? :gruebel: |
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Danke allerseits, es funktioniert, einen schönen Sommerabend E. B.
|
Re: Möchte StringGrid für verschiedene Typen (Variablenforma
Moin Hansa,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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