Allgemein Bugs Versionen |
Allgemein
Zu der Zeit als ich damit anfing, mich intensiver mit Delphi zu beschäftigen,
las ich in den diversen Newsgroups des öfteren die Frage, wie man denn in
einem StringGrid den Text rechtbündig oder zentriert ausgegen kann.
Da ich ein solches Element auch in meinem eigenen Projekt
(das Datenbank-Frontend mit dem ich die Raumfahrt-Statistiken
erstellt habe) gebrauchen konnte
wurde dies meine erste Komponente. Bei der ersten Fassung konnte man nur für das
gesamte Gitter die Textorientierung einstellen, und mit der Zeit sind mehr
und mehr Funktionen hinzugekommen - Farben, Orientierung, Zeichensatz für Zellen,
Spalten oder Zeilen, Hints für einzelne Zellen, Unterstützung der Zwischenablage,
Speichern in Datei, Export als CSV oder HTML und noch einige mehr womit die Komponente
mittlerweile sich sicher mit einigen kommerziellen Komponenten messen lassen kann.
Das ganze ist ein 100kb großes zip-Archiv inkl. des gesamten Quelltextes sowie einer (englischen) Online-Hilfe. Es läuft in allen Delphi-Versionen, und ist Freeware.
Download TStringAlignGrid (Zip-Archiv, 100kB)
Bugs of V2.1
Bugs in V2.0
Zusätzlich zu den untenstehenden Fixes muß noch die Datei
ah_def.inc aktualisiert werden, einfach die
im Archiv vorhandene Datei mit dieser ersetzen..
Obwohl ich eigentlich die Version 2.1 wegen Delphi 6 erstellt habe, ist
beim Zusammenstellen des Archivs die unkorrigierte Datei ah_tool.pas
benutzt worden, und nicht die für D6 bearbeitete.
Es ist aber recht leicht zu korrigieren, einfach den Compilerschalter
(*$ j+*) im interface-Teil der Unit hinzufügen.
Schande über mich - ich hatte vergessen es unter Delphi 1 zu testen, und
natürlich funktioniert es nicht. Da es zuviele Stellen sind die zu ändern
wären kann sollte statt dessen einfach die
Version 2.0 benutzt werden, da diese ohnehin die
gleiche Funktionalität enthält.
In der Ereignis-Prozedur OnKeyPress gibt die Property Cells[] der aktuellen Zelle
nicht den gerade aktuellen Wert, sondern den Wert vor dem Editieren zurück.
Dies ist verursacht durch Code, den ich für ein zukünftiges Feature vorgesehen hatte,
der aber noch keine Funktion (außer dieser Fehlfunktion) hat, und daher einfach
gelöscht werden kann:
procedure TStringAlignGrid.WMCommand(var Message: TWMCommand);
begin
inherited;
end;
Manchmal werden die zellenspezifischen Hints nicht angezeigt. Dies kann dadurch
korrigiert werden, daß ein OnShowHintCell Ereignis angelegt wird, in dem
dann CanShow auf true gesetzt wird,
oder durch Nachtrag der vergessenen Initialisierung der CanShow Variable:
procedure TStringAlignGrid.CMHintShow(var Message: THintMessage);
var
canshow: boolean;
begin
canshow:=true;
ShowHintCell(message.HintInfo^.HintStr, canshow, message.HintInfo^);
[...]
end;
Beim Editieren der Zeichensätze im Komponenteneditor kann es gelegentlich dazu
kommen, daß ein ungültiger Integer-Wert in das DFM-File geschrieben wird.
Dies kann dadurch vermieden werden, wenn in der Prozedur WriteFont
das cardinal durch integer ersetzt wird.
procedure WriteFont(Writer: TWriter; v:TFont);
var
t: TFontStyles;
begin
[...]
Writer.WriteInteger(integer(pointer(@t)^));
end;
Das Einbinden der Komponente in andere Package über die Dateialigridr.pas
funktioniert auf jeden Fall, soll jedoch das Package ah_comp.dpk
verwendet werden, reicht es völlig aus, die folgende Zeile zu löschen:
{$R 'Aligrid.d32'}
Probleme bei Verwendung on EditMask
Das OnKeyPress-Ereignis funktioniert nicht genauso wie im Vorgängertyp,
und zwar wird es nicht mehr aufgerufen, wenn man im Editiermodus ist.
Interessanterweise führt der gleiche Fehler auch zu einem falschen
Verhalten bei der Verwendung einer EditMask, dann kann nämlich nur das
erste Zeichen editiert werden. Korrigiert wird beides durch Austausch der Methode
TNewInplaceEdit.KeyPress durch die folgende:
procedure TNewInplaceEdit.KeyPress(var Key: Char);
begin
if (col=-1) or (row=-1) then key:=#0;
if (key=#13) then begin
if not f_multiline then
postmessage(TStringAlignGrid(self.owner).handle,cn_edit_return,col,row)
else if f_multiline then
if not TStringAlignGrid(self.owner).CanEditModify then
Key := #0;
end;
if (key=#27) and not f_multiline then begin
self.text:=oldtext;
postmessage(TStringAlignGrid(self.owner).handle,cn_edit_cancel,col,row);
key:=#13;
end;
if key=#9 then key:=#0;
inherited KeyPress(Key);
end;
Meine C++-Kenntnisse sind recht bescheiden, deswegen habe ich auch nicht den
C++ Builder, und kann daher nur aus dritter Hand über die Probleme berichten.
Es scheint, daß das TSpinEdit im Builder unter einem anderen Namen existiert,
und da ich es im Komponenteneditor verwende führt dies zu einer Fehlermeldung.
Wenn ich das nächste Mal am Komponenteneditor arbeite werde ich auf das spinedit
verzichten, aber bis dahin habe ich leider keine Idee wie die Komponente ans Laufen
zu bringen wäre.
Date | Version | Changes |
---|---|---|
1995-12 | nur globale Textorientierung | |
1995-12-17 | 1.0 | erste veröffentlichte Version, Orientierung fur Zellen, Spalten oder global |
1996-07-03 | 1.1 | Reset-Methoden zum zurücksetzen auf Default |
1996-12-14 | 1.2 | interne Speicherung der daten umgeschrieben Hints für einzelne Zellen |
1997-02 | 1.3 | nicht veröffentlich Zeichensatz analog zur Orientierung Application.OnXXX-Multiplexer geschrieben |
1997-03-07 | 1.4 | Zeilenabhängige Schriften oder Orientierung Komponenteneditor und Speicherung im DFM |
1997-05-22 | 1.5 | Hintergrundfarben Komponenteneditor erweitert Inplace-Editor berücksichtigt Schrift, Farbe etc. einige Hilfsroutinen wie RemoveRow eingebaut Probleme beim RowMoving/ColMoving |
1997-09-10 | 1.6 | Mehr Funktionen des Inplaceeditors, read-only Zellen Import und Export Brushs statt Farben intern Unterstützung für mehrzeilige Texte Farbe der selektierten Zellen |
1997-12-07 | 1.7 | Sortieren Import und Export zur Zwischenablage nächste editierbare Zelle flexibler anspringbar |
2000-02-12 | 2.0 | Interne Speicherung umgebaut Cut and Paste Methoden zur Zellengröße Wordwrap Onlinehilfe (englisch) Kompatibilität zu Delphi 5 und Delphi 1 |
2001-07-09 | 2.1 | Kompatibilität zu Delphi 6 |
Letzte Änderung 2002-09-25