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 = < 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
ssb-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;
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 > 0) then begin while ((i < FColumns.Count) and (i < ColCount)) do begin Cells[i, 0] := FColumns[i]; inc(i); end; end; end; 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!