Autor |
Beitrag |
NetSpider
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: 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?
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
_________________ Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
|
|
ssb-blume
      
Beiträge: 375
Erhaltene Danke: 7
XP, W7, W8
Deutschland
|
Verfasst: 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
      
Beiträge: 358
Win XP Pro, Win 7 Beta
BDS 2006
|
Verfasst: 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 
_________________ Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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 
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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:
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
Einloggen, um Attachments anzusehen!
|
|
Sirius Fog
Hält's aus hier
Beiträge: 1
|
Verfasst: 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
|
Verfasst: 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
|
|