Autor Beitrag
mccom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Mi 29.11.06 20:05 
Hallo!

Erstmal zur Info, ich nutze Delphi 6 Personal.

So, Mein Problem ist denke ich recht einfach, nur finde ich durch suchen einfach keine Lösung, vielleicht suche ich auch einfach nur mit den falschen Worten.

Ich würde gerne Strings in eine Tabelle schreiben, also ein TStringGrid nutzen. Die Strings kommen aus einem Array. So nun sollen aber die Strings Teilweise Fett sein. Also zB.: "das ist eine dumme Frage". Kann ich so eine Art BBCode benutzen um Delphi dazu zu bekommen nur einzelne Buchstaben fett zu machen? wahlweise würde auch farbig gehen, ich will sie nur abheben vom rest.

Also kurzzusammengefasst, Strings sollen in eine tabelle, einzelne Teile eines Strings in der Tabelle sollen sich vom rest abheben.

Wäre super wenn ihr dazu eine Idee hättet.

Vielen Dank im voraus.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 29.11.06 20:56 
Hallo,

das kann man innerhalb der OnDrawCell-Ereignisbehandlung realisieren.

Denk Dir doch so eine Art BBCode aus: "das ist eine #dumme# Frage"
Dann den String in die entsprechenden Teile zerlegen, interpretieren
und einzeln an der richtigen Position mit TextOut ausgeben.
Bei der Berechnung der Ausgabe-Positionen hilft einem Canvas.TextWidth.

Wenn der String auch noch umgebrochen werden soll, wird es kompliziert.


Ich wünsch Dir schon mal viel Spass dabei. :mrgreen:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.11.06 20:56 
Das kannst du nur durch selber zeichnen lösen! Delphi hat keine solche Lösung integriert.
Kuck dir mal die OwnerDraw Sachen an, es gibt dort glaube ich OnAdvancedOwnerDrawCell oder sowas um eine Zelle seber zu zeichnen. Dort musst du dann mit Canvas.TextOut arbeiten (und vorher die Schriftart Canvas.Font deinen Ansprüchen entsprechend einstellen). Einfach ist das nicht...

Ich weiß nicht, ob alles genau so ist, wie ich es eben geschrieben habe ;-), war einfach so aus meiner Erinnerung, aber bei Problemen schaue ich natürlich nochmal in Delphi nach... Ich wollte nur erstmal grob was dazu sagen, vor allem, dass Delphi selbst das nicht kann.

Ach so: Wie es mit einem StringGrid ist weiß ich nicht, aber in der JEDI VCL ist zumindest eine HT-ListBox dabei, die HTML-Tags, zum Beispiel für Fettdruck, versteht. Ob da auch ein StringGrid dabei ist, schau ich mal...

// EDIT:
Ok, user profile iconLannes hat natürlich Recht... Es ist OnDrawCell, keine Ahnung, wo es das von mir angegebene Event gab. Vielleicht in der VirtualTreeView? Egal.

Es gibt jedenfalls HT-Komponenten von JEDI nur als Label, ComboBox und ListBox. Schade. Da kommst du ums Selberzeichnen nicht drumrum, denn ich glaube kaum, dass jemand solch eine Komponente schon geschrieben hat...
mccom Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Do 30.11.06 07:19 
So, ich hab mich gestern abend noch etwas in die handbücher gestürtzt. ich hab aber leider nur einen fetten welzer von delphi 5... Nun ja, dieser sagt mir, "das TStringGrid von TdrawGrid die Möglichkeit erbt, vom besitzer gezeichnet zu werden. Wenn sie also ein gitter-element selbst zeichnen und gleichzeitig Text in jeder Zelle speichern wollen, ist die verwendung on TStringGrid die einfachste lösung."

Aber naja, TListBox hat bei mir in Delphi6 einen unterpunkt Styls in dem ich lbOwnerDraw anmachen kann. Aber aber beide Grids haben diesen Punkt nicht.

Könntet ihr mir da helfen? Denn Listbox bringt mir leider in dem Fall weniger weil ich MIN 3 Spalten brauche...
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 30.11.06 09:11 
Hallo,
user profile iconmccom hat folgendes geschrieben:
mccom#s Delphi-Handbuch:
...Wenn sie also ein gitter-element selbst zeichnen und gleichzeitig Text in jeder Zelle speichern wollen, ist die verwendung on TStringGrid die einfachste lösung...

Das heist, das man in Cells einen String speichern kann, aber beim Zeichnen einer Zelle etwas anderes ausgibt.
Um beim Beispiel zu bleiben:
ausblenden Delphi-Quelltext
1:
StringGrid.Cells[c,r] := 'das ist eine #dumme# Frage';					
dann interpretieren in OnDrawCell und mit TextOut ausgeben/zeichen:
das ist eine dumme Frage


user profile iconmccom hat folgendes geschrieben:
Aber naja, TListBox hat bei mir in Delphi6 einen unterpunkt Styls in dem ich lbOwnerDraw anmachen kann. Aber aber beide Grids haben diesen Punkt nicht....
bei der ListBox muss man den Style umstellen, damit OnDrawItem überhaubt ausgelöst wird.

Das ist beim StringGrid nicht erforderlich, OnDrawcell wird immer ausgelöst.
Beim StringGrid kann man durch setzen der Eigenschaft DefaultDrawing entscheiden ob man alles selber Zeichnen will.

In dem Beitrag "Griechische Buchstaben in Label oder Stringgrid", findest Du ein Beispiel mit zwei Schriftarten in einer Zelle, genau dort:
Der Folgende Code benutzt Wingdings und Arial in einer Zelle...(mit Zeilenumbruch)

Schau Dir auch mal den Beitrag direkt davor von user profile iconalzaimar an,
das könnte eventuell auch ein Ansatz zur Lösung deines Problems sein.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )