Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mi 01.01.03 22:00
hallo,
in einer listbox die farbe des textes ändern, das ist doch einfach, doch wie kann ich die farbe des textes in einer bestimmten zeile ändern?
und wenn es nicht mit einer listbox geht, geht das dann vielleicht mit einem memo, oder so?
achso und noch eine frage:
kann ein user durch einen button klicke ein neues label errstellen und auf eine bestimmte positiopn setzten ?
und wie kann ich einzelne komponenten in delphi per pfeilktasten verschieben? z.z. geht das bei mir nur mit der maus.
mfg hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 01.01.03 22:56
Alle deine Fragen lassen sich mit der Formu-Suche beantworten.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 01.01.03 23:16
Luckie hat recht, aber hier ein paar Hinweise:
1. In einer ListBox geht das ziemlich gut. Ich habe es zwar noch nie verwendet und kenne deswegen auch nur eine (wahrscheinlich noch verbesserungswürdige Version):
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); VAR oldcolor : TColor; begin with listbox1 do begin oldcolor:=canvas.pen.color; canvas.Pen.Color:=clWhite; canvas.FillRect(Rect); canvas.Pen.Color:=oldcolor; if index = 5 then begin canvas.Font.Color:=oldcolor; canvas.Font.Color:=clGreen; end; canvas.TextOut(rect.left,rect.top,Items[index]); if index = 5 then canvas.Font.Color:=oldcolor; end; end; |
Damit wird das 5. Item grün geschrieben.
2. Ein neues Label zu erstellen ist auch nicht sehr schwer:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); VAR mylabel : TLabel; begin mylabel:=TLabel.Create(Form1); mylabel.Parent:=Form1; mylabel.Name:='label'+IntToStr(anzahl); mylabel.Left:=20*anzahl; mylabel.top:=20*anzahl; inc(anzahl); end; |
anzahl ist dabei eine globale Integervariable, die verwendet wird, damit die Labels eindeutige Namen haben.
Wenn du später noch ein Label ansprechen willst, kannst Du das z.B. so machen:
Quelltext 1:
| TLabel(Form1.FindComponent('label2')).Caption:='hallo'; |
3. Das mit dem Verschieben von Komponenten sollte über das KeyDown-Ereignis zu machen sein, außerdem hilfreich ist wahrscheinlich die Eigenschaft "Keypreview" der entsprechenden Form.
MfG,
Peter
P.S.: Und denk' nächstes mal bitte wirklich an die Suchfunktion!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 02.01.03 09:58
Peter Lustig hat folgendes geschrieben: | Damit wird das 5. Item grün geschrieben. |
Nein, das 6. - der Index ist doch null-basierend. 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 02.01.03 13:12
Autsch! Hast recht! 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Do 02.01.03 14:23
hai peter,
vielen dank für die schnelle antwort, ob es funktioniert werde ich gleich sehen, aber eine sache hast du falsch verstanden. ich will die komponenten nicht im eigendlkichen programm verschieben, sondern noch in entwurfsmodus.
ach und Luckie, du kennst das ja, wie das ist, man ist meistens zu faul  , aber dann werde ich noch einen guten vorsatzt für das jahr 2003 ändern: im auq forum zuerst die such funktion nutzen.
mfg hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 02.01.03 14:42
Zitat: | ich will die komponenten nicht im eigendlkichen programm verschieben, sondern noch in entwurfsmodus. |
Ach so!!
Das Verschieben zur Entwurfszeit funktioniert, wenn du STRG + [entsprechende Pfeiltaste] drückst. Um die Größe zu ändern, verwendest Du statt STRG einfach SHIFT.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Do 02.01.03 16:58
Danke !
aber nochmal eine frage zur listbox:
wie geht das genau, dass sich die farbe ändert, ich habe alles fein säuberlich eingetragen, aber der farbe änder sich nicht. geht das vielleicht auch anders als mit der procedure TForm1.ListBox1DrawItem?
denn ich weiß nicht genau, wie ich diese procedure ansprechen soll, damit sich was tut, denn bei mir tut sich nicht in dem beispiel von peter.
mfg hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 02.01.03 19:07
Oh, ich habe vergessen, Dir zu sagen, dass Du den Style ändern musst auf OwnerDraw? wobei das Fragezeichen dafür steht, dass ich im Moment nicht weiß, welches der beiden. Einfach mal ausprobieren!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Do 02.01.03 21:01
danke !!
aber da hab ich leider noch ne frage:
kann ich das auch per button klick machen ?
mfg hibbert
p.s. es ist der style lbOwnerDrawVariable !
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Do 02.01.03 22:05
Hallo
@hibbert
der Style ist OwnerDrawfixed
OwberDrawvariable wäre für unterschiedliche Itemhöhen, dann tritt auch ein anderes Ereignis zum Zeichnen ein (onmeasureitem)
Zitat: |
kann ich das auch per button klick machen ?
|
was wie mit Buttonklick machen? das zeichnen?
Dazu kannst du einen Umweg über zusätzliche Variable (z.B. in Form deklariert) gehen, diese beim Buttonclick setzen und mit Listbox1.repaint die Listbox neuzeichnen
@peter
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with Control as Tlistbox do begin //hintergrund Canvas.fillrect(rect); //text if index=5 then Canvas.Font.color:=clgreen else Canvas.Font.color:=clblack; Canvas.Textout(rect.left,rect.top,Items[index]); end; end; |
geht auch.
warum nutzt du oldcolor?
Zitat: |
canvas.Pen.Color:=clWhite;
canvas.FillRect(Rect);
canvas.Pen.Color:=oldcolor;
|
das erste pen.color ist z.B. unnötig. Du möchstest den Hintergrund , dann wäre es canvas.brush.color
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Do 02.01.03 23:19
hallo,
hey danke für die verkürzung, doch meine neuen probleme bleiben dennoch:
ich habe den code etwas verändert.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| if label5.Caption='4'then begin a:=strtoint(label4.Caption); begin with Control as Tlistbox do begin //hintergrund Canvas.fillrect(rect); //text if index=a then Canvas.Font.color:=clgreen else Canvas.Font.color:=clgreen; Canvas.Textout(rect.left,rect.top,Items[index]); end; end; end; |
so, nun ist mein problem, dass ich mehre´re items mit je einer anderen farbe belegen möchte.
ich zhabe noch eine 2. form erstellt, in der man auswählen kann, was in der listbox stehen soll, und welche frabe das hat. ich mache es etwas umstandlich, ich überprüfe zuerst das label4 das einen wert von 1-4 haben kann, und füge den code (siehe oben) 4 mal ein und überprüfe das so.  ist da noch einer mitgekommen ?
nun es ändern sich entweder alle farben (mein beispiel) oder bei jedem item wird die farbe wieder zurückgestellt und nur das aktuelle item erhält die neue farbe (siehe peters beispiel).
gibt es eine lösung für mein problem ?
mfg hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 03.01.03 14:28
@keldorn: oldcolor verwende ich zur Sicherheit, falls die ListBox noch in anderen Prozeduren gezeichnet wird und dabei auch Farbwerte gesetzt werden. Ist so 'ne Angewohnheit von mir: besser ein paar Zeilen zu viel schreiben, als ein paar zu wenig.
Zitat: | das erste pen.color ist z.B. unnötig. Du möchstest den Hintergrund , dann wäre es canvas.brush.color |
Ach, verdammt, scheint echt nicht mein Tag gewesen zu sein. Hast recht.
@hibbert: (Hinweis: ich hoffe, heute bin ich besser drauf!) Wenn Du zu jedem Item speicherst, welche Farbe es haben soll, dann mach das doch in einem Array of TColor (z.B.: Farben : ARRAY OF TColor), wobei die Nummern der zugehörigen Farben mit den Nummern des Items in Deiner Liste übereinstimmen. Dann kannst Du schreiben: canvas.font.color:=Farben[index]
Übrigens wird in Deinem Quelltext FOnt.Color immer auf clgreen gesetzt, egal ob index=a ist oder nicht.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Fr 03.01.03 19:08
hai,
oops, ich versteh nur noch bahnhof...
wie soll das denn mit Zitat: | Array of TColor (z.B.: Farben : ARRAY OF TColor), |
gehen bzw. gemeint sein, das ist mal wieder was neues für mich, und wenn ich das mit
Quelltext 1:
| canvas.font.color:=Farben[index] |
einfach bei mir einsetze, also
Quelltext 1:
| if index=a then Canvas.Font.color:=clblack[index] |
dann habe ich folgende meldung vom debugger (oder so) erhalten:
Zitat: | [Error] Unit1.pas(51): Array type required |
was nun, ich verzweifle langsam...
kannst du mir nocheinmal weiterhelfen.
danke
mfg hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 03.01.03 19:23
Also, Du hast geschrieben, dass der Benutzer bei jedem Item auswählen kann, in welcher Farbe es erscheinen soll.
Ein Array ist eine Menge von Werten, die Du über einen Index ansprechen kannst. Eindimensional kannst Du Dir ein Array als Liste von durchnummerierten Variablen vorstellen. Das Array Of TColor ist also eine Liste von Farbwerten. Allerdings ist hier noch nicht entschieden, wie lang diese Liste ist. Das machst Du mit dem Befehl "SetLength".
Quelltext 1: 2: 3: 4:
| VAR Farben : ARRAY OF TColor; begin SetLength(farben,5); end; |
So, jetzt hast Du festgelegt, dass das Array 'Farben' 5 Farbwerte enthält. Durchnummeriert wird das ganze von 0 bis 4. Wenn Du den zweiten Wert dieser Liste ansprechen willst, machst Du das über Farben[1]. Das ist ein Wert vom Typ TColor. Und wenn Du in Deine Liste etwas eintragen willst, kannst Du so den Wert Farben[1] auch mit einem Wert belegen. Also so:
Quelltext
Wenn jetzt der Benutzer also die zweite Zeile Deiner ListBox grün gefärbt haben möchte, speicherst Du mit dem obigen Code an der zweiten Stelle deiner Liste den Wert grün. Entsprechend speicherst Du dann für die dritte Zeile Deiner ListBox den Farbwert an der dritten Stelle Deiner Liste.
Und wenn es dann daran geht, die Zeilen Deiner ListBox im OnPaint-Ereignis zu zeichnen, musst Du die Zeile, die an der Position index in der ListBox steht, mit der Farbe zeichnen, die in Deinem Array 'Farben' an Position index steht. Also:
Quelltext 1:
| Canvas.Font.Color:=Farben[index]; |
Noch ein paar Hinweise für die Benutzung des Arrays:
Length(Farben) gibt Dir die Anzahl der Werte des Arrays, High(Farben) den letzten möglichen Index.
Ich habe oben statt Array immer Liste gesagt. Das war aber nur, damit das ganze anschaulicher wird. Listen sind nämlich eigentlich noch was anderes.
Zitat: | kannst du mir nocheinmal weiterhelfen |
Klar, deswegen sind wir ja alle hier!
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
|