Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - StringGrid Zellen zur Entwurfszeit


NetSpider - Mo 05.02.07 17:20
Titel: StringGrid Zellen zur Entwurfszeit
Ich hab mal eine Frage zum TStringGrid. Leider lassen sich die Ueberschriften fuer diese Komponente nicht zur Entwurfszeit festlegen. Die Aehnlich Komponente TDBGrid besitzt diese Eigenschaft.

Gibt es vielleicht eine Moeglichkeit diese Beschriftungen ueber die *.dfm Datei zu realisieren? Jedes Formular speichert dort die Position und Einstellungen aller Komponenten. Unten ist das Beispiel fuer ein DBGrid. Das muesste man doch irgendwie auch mit dem normalen StringGrid machen koennen, oder?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
      object DBGridBooking: TDBGrid
        Left = 0
        Top = 0
        Width = 463
        Height = 648
        Align = alClient
        DataSource = DataModule1.DataSourceBooking
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'Tahoma'
        TitleFont.Style = []
        OnDrawColumnCell = DBGridBookingDrawColumnCell
        OnMouseMove = DBGridBookingMouseMove
        OnTitleClick = DBGridBookingTitleClick
        Columns = <                                  // Hier werden die Spalten erstellt
          item
            Color = clInfoBk
            Expanded = False
            FieldName = 'TableIndex'
            PickList.Strings = (
              'TEST')
            Title.Alignment = taCenter
            Title.Font.Charset = DEFAULT_CHARSET
            Title.Font.Color = clNavy
            Title.Font.Height = -11
            Title.Font.Name = 'Tahoma'
            Title.Font.Style = []
            Width = 36
            Visible = True
          end


Hab schon ein bisschen rumprobiert, hat aber alles nichts geholfen. Rows, Columns, Items, Strings... (siehe Kommentar oben) Viellecht hat von euch jemand eine Ahnung.

Vielen Dank


ssb-blume - Mo 05.02.07 18:04

Ist nicht in der Klasse vorhanden!
Geht leider auch bis CustomControl zurück. Selbst erzeugen ist Wahnsinn.

Also: TLabel darueber schreiben!


Renegade - Mo 05.02.07 18:28

user profile iconssb-blume hat folgendes geschrieben:
Ist nicht in der Klasse vorhanden!
Geht leider auch bis CustomControl zurück. Selbst erzeugen ist Wahnsinn.

Also: TLabel darueber schreiben!


Spaßig wenn die Spaltenbreiten geändert werden :roll:


Klabautermann - Mo 05.02.07 18:38

Mir würde da auf Anhieb nur einfallen, dir eine eigene Komponente von tStringGrid ab zu leiten und dir diese so an zu passen, dass du die Spalten überschriften per neuen (tStringlist) property im Objektinspektor entgegen nimmst.

Gruß
Klabautermann


NetSpider - Mo 05.02.07 18:44

OK, ich hab das StringGrid jetzt eliminiert und statt dessen ein TListView genommen. Das erfuellt seine Zwecke genauso - und es besitzt die Eigenschaft die Ueberschrift-Titel zur Entwurfszeit festzulegen.

Das andere waere wirklich zu viel Arbeit... Nur wegen so ein paar Beschriftungen...

Danke trotzdem


Klabautermann - Di 06.02.07 09:33

Hallo,

auch wenn du mittlerweile eine gute Lösung gefunden hast, will ich doch ein wenig die Angst vor dem erweitern von Komponenten nehmen. Heute morgen habe ich 10 Minuten Zeit gefunden um einmal die Oben von mir beschriebene Erweiterung von tStringGrid zu implementieren.

Das ganze sieht dann so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
unit ColStringGrid;

interface

uses
  SysUtils, Classes, Controls, Grids;

type
  tColStringGrid = class(TStringGrid)
  private
    FColumns: tStringList;
    procedure SetColumns(const Value: tStringList);
  protected
    procedure SetHeaders;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Columns : tStringList read FColumns write SetColumns;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [tColStringGrid]);
end;

{ tColStringGrid }

constructor tColStringGrid.Create(AOwner: TComponent);
begin
  inherited;
  FColumns := tStringList.Create;
end;

destructor tColStringGrid.Destroy;
begin
  FreeAndNil(FColumns);
  inherited;
end;

procedure tColStringGrid.SetColumns(const Value: tStringList);
begin
  FColumns.Assign(Value);
  SetHeaders;
end;

procedure tColStringGrid.SetHeaders;
  var
    i : integer;
begin
  i := 0;
  if (RowCount > 0then begin
    while ((i < FColumns.Count) and (i < ColCount)) do begin
      Cells[i, 0] := FColumns[i];
      inc(i);
    end// mit Allen Titeln oder Spalten - was auch immer zu erst ausgeht
  end// zur sicherheit
end// Set Headers

end.


Dieses String Grid erhält ein neues Property (Columns). Die hier eingegebenen Titel werden in der ersten Zeile auch zur Designtime ausgegeben. Der Aufwand hierzu hält sich wie du siehst in Grenzen (man könnte vielleicht mehr Zeil in eine sinnvollere Namensgebung investieren ;)).

Gruß
Klabautermann


Sirius Fog - Do 18.03.10 12:22

Hallo,

ich habe eine ähnliche Komponente erstellt, ebenfalls von TStringGrid abgeleitet.
Ich nutze Delphi 2010.

Das Problem ist, dass die Einträge, die ich über den Objektinspektor hinzufüge nicht mehr angezeigt werden, wenn ich das Form starte. Auch wenn ich das Projekt in Dephi speichere und dann wieder einlade sind die Überschriften nicht im Grid zu sehen, allerdings sind sie noch in der TStringList-Liste im Objektinspektor.

Ich habe auch die Komponente von Klabautermann runtergeladen und getestet. Genau das gleiche.

Ideen?

Gruß,
Foggy


HawkMacs - Mi 05.05.10 19:06

Hi,
gespeicherte Property Werte sind zur Laufzeit erst nach dem Ausführen des Constructors verfügbar.
Es nützt also nichts, diejenigen Initialisierungen im Constructor vorzunehmen, welche auf gespeicherte Werte
(wie z.B. Spaltenüberschriften in Stringlisten) zugreifen.

Das hier hilft, obwohl ich keine Ahnung habe, ob es das Standardvorgehen ist. Die gegoogelten Tutorials sind erstaunlich schweigsam, was das angeht. Also:

Überschreibe für Initialisierungen, die auf published Werte zugreifen, die Protected Procedure Loaded und nimm die Initialisierungen dort vor. Override und inherited nicht vergessen, sonst funktionieren nachher die geerbten Properties nicht mehr.
Die Prozedur wird von der VCL automatisch nach dem Laden der gespeicherten Property Werte aufgerufen.

Danach sollte es funktionieren. Falls nicht, könntest du in den Write Prozeduren deiner Properties nach Abfragen der Form "if FMYPropertyVar<>Value" suchen. Wenn der gespeicherte Wert gleich dem Default ist, tut sich dann natürlich auch nichts.
Bisschen spät, aber ich hoffe, es hilft jemandem.
Gruß,
Markus