Autor Beitrag
hibbert
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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



BeitragVerfasst: Mi 01.01.03 22:56 
Alle deine Fragen lassen sich mit der Formu-Suche beantworten.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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):

ausblenden 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:
ausblenden 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:
ausblenden 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



BeitragVerfasst: 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. :wink:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 02.01.03 13:12 
Autsch! Hast recht! :oops:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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 :P , 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Do 02.01.03 21:01 
danke !! :D :D :D
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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.
ausblenden 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. :shock: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Fr 03.01.03 19:08 
hai,
oops, ich versteh nur noch bahnhof... :cry:
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
ausblenden Quelltext
1:
canvas.font.color:=Farben[index]					

einfach bei mir einsetze, also
ausblenden 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... :cry:
kannst du mir nocheinmal weiterhelfen.
danke

mfg hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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".
ausblenden 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:
ausblenden Quelltext
1:
Farben[1]:=clGreen;					

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:
ausblenden 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".