Autor Beitrag
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Mo 05.02.07 17:20 
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?

ausblenden volle Höhe 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

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: 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!

_________________
Brain: an apparatus with which we think we think.
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: 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:

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: 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

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:

ausblenden volle Höhe 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
Einloggen, um Attachments anzusehen!
Sirius Fog
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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