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 Möchte StringGrid für verschiedene Typen (Variablenformate) (https://www.delphipraxis.net/72326-moechte-stringgrid-fuer-verschiedene-typen-variablenformate.html)

EccoBravo 28. Jun 2006 17:47


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:
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.
Ob ich in den markierten Zeilen die Parameterliste weglasse oder nicht immer kommt die Fehlermeldung Inkompatible Typen

Mir fehlt hier irgendwie die Phantasie, wie ich das mit den Cell-Indices i, j hinbekommen kann.

Danke für Hilfe E. B.

Christian Seehase 28. Jun 2006 18:12

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:
property CellFloatX[ACol, ARow : integer] : single read GetCellFloatX write SetCellFloatX;
Drücke STRG-SHIFT-C.
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]

EccoBravo 28. Jun 2006 18:16

Re: Möchte StringGrid für verschiedene Typen (Variablenforma
 
Hallo Chris,

danke, aber dann kommt der Fehler auch.

Grüße

E. B.

Hansa 28. Jun 2006 18:25

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

EccoBravo 28. Jun 2006 19:00

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.

Hawkeye219 28. Jun 2006 19:37

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

Hansa 28. Jun 2006 19:45

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:
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.
Alleine in der reduzierten Fassung waren vorher 5 Fehler auszubessern. Der Code hier wird sich compilieren lassen. Er nützt aber nichts, wegen des
Delphi-Quellcode:
Cells [1,1]
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 ?

wg. roter Kasten : Ja, ähnliche Überlegung. Aber nützt das was im public ? :gruebel:

EccoBravo 28. Jun 2006 19:59

Re: Möchte StringGrid für verschiedene Typen (Variablenforma
 
Danke allerseits, es funktioniert, einen schönen Sommerabend E. B.

Christian Seehase 28. Jun 2006 23:19

Re: Möchte StringGrid für verschiedene Typen (Variablenforma
 
Moin Hansa,

Zitat:

Zitat von Hansa
Ja, ähnliche Überlegung. Aber nützt das was im public ?

kombiniere mal Hawkeyes Änderungsvorschlag mit meinem => Funktioniert mit Array.


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