Autor Beitrag
patrick dee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: Mo 06.01.03 09:21 
hi leute,

habe das schon mal gefragt aber ich kriege es einfach nicht hin.
mit der enter taste übernehme ich einen eintag aus der listbox in einen label. nun soll die zeile die ich mit der enter taste gewählt habe grau dargestellt werden und die schrift in weiss. so das ich sehen kann wievile einträge ich schon benuzt habe. irgenwie etwas mit neu zeichen itemdraw habe ich schon probiert bekomme es einfach nicht hin. also jedesmal wenn ich enter drücke soll die zeile des items in der listbox farblich wie oben beschriben markiert werden.
bin echt dankbar für jede hilfe. vielleicht hat jemand eine sozial sekunde und kann mir das mal erklären wie so etwas geht

gruß

patti :cry:

_________________
Glauben heißt nichts wissen ...
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: Mo 06.01.03 10:06 
Hallo,

dazu müßte man erstmal wissen, wie sich die daten zusammensetzen.

1. Beispiel: du hast bereits ein Array/Liste und füllst die Listbox mit den Daten des Array. dann kannst du das Array um eine Boolean z.B. "Ausgewahlt" erweitern und diese beim Ondrawitem auswerten und die Farbe änbdern.

2. Du hast kein array, füllst die Listbox direkt ?

sag erstmal wie du es genau machst!

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mo 06.01.03 10:34 
Kann der User in der Listbox nur einen Eintrag markieren (also mit der Enter Taste) oder mehrere. Im letzteren Fall würde vorschlagen Du benutzt eine CheckListBox!

Gruß
TINO
patrick dee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: Mo 06.01.03 10:43 
hi

laden der listbox :
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var
  datum : string;
begin
  datum:= FormatDateTime('dd-mm-yy',NOW);
      ListBox1.Items.LoadFromFile( edit1.text + datum + '.mus' );
        ListBox1.ItemIndex:=2;   //position in der liste nach start
         end;

Dies ist eine liste die geladen wird in der musik titel stehen die ich mit der
enter taste in den waveplayer von mir lade. geht alles soweit. nun soll aber der eintrag den ich nehme bzw die ganze zeile grau sein und dr text schwarz. natürlich soll dies für mehrere einträge gehen. so kann ich nämlich sehen welche titel ich schon genommen habe und welche nicht.grau zeile titel schn mal geladen.

ich hoffe das es jetzt etwas verständlicher war.

gruß
patti

(07.01. 09:42 Tino) Code-Tags hinzugefügt.

_________________
Glauben heißt nichts wissen ...
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: Mo 06.01.03 11:17 
Soll die Sache, obe der Titel schon mal ausgewählt war auch mit gespeichert werden?
werden nach erstellung der Listbox Einträge einzeln hinzugefügt oder immer nut komplett (z.B. ganzes Verzeichnis)?

Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
patrick dee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: Mo 06.01.03 11:26 
hi

in der liste werden keine titel zugefügt :

2039\15 JAMIE S GIRL ROCH VOISINE 02:25
2001\06 TO LOVE SOMEBODY BEE GEES 02:58
2011\10 SOMEWHERE IN THE NIGHT OAK RIDGE BOYS 03:19

so sieht die liste aus mit enter tast wirden die ersten 7 zeichen ausgelesen
und dem player als filename + '.wav' übergeben. dann soll die zeile makiert werden damit ich weiss das ich sie schon mal geladen habe. wenn man erneut auf eine makierte zeile steht und enter drückt passiert das gleiche. wird die liste geschlossen sollen natürlich alle makierungen erhalten bleiben das wenn man sie erneut laden tut sieht was schon gebraucht wurde

gruß

patti

_________________
Glauben heißt nichts wissen ...
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: Mo 06.01.03 11:51 
Die Idee mit der Checklistbox ist auch nicht verkehrt, das Checked kannst Du glaube aber nicht mit speichern.
da du eh viele Daten verwendest, kommst Du für mich besser, wenn Du dir gleich ein Record und Dyn. Array oder eine Liste erstellst und mit diesem arbeitest. der Listbox fügst Du dann die erforderliche Anzahl von Zeilen hinzu und beim Ondraw greifst du auf das direkt auf Array/Liste zu. zum Laden/Speichern kannst Du einen Stream nehmen. So oder so sind aber einige Schritte dazu nötig.
Wenn du noch Probleme hast, komm ich heute abend evtl noch dazu, ein wenig Bsp-code zu geben.

Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
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: Di 07.01.03 09:03 
klar gekommen?

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
patrick dee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: Di 07.01.03 14:09 
nein leider nicht

habe mir das ganze nicht so schwer vorgestellt das wenn man eine enter taste drückt und gleichzeitig die zeile auf der man in der listbox steht grau gezeichnet werden soll. habe auch mal nach einem toutorial im netz dazu gesucht bis lang ohne erfolg es gibt wenig infos zu listbox bei den meißten nur zählen, löschen einfügen und das wars zumindest das was ich gefunden habe. nicht mal torry hatte etwas

also ich sthe vor einem großen loch und keine plan

gruß

patti

_________________
Glauben heißt nichts wissen ...
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: Di 07.01.03 15:04 
patrick dee hat folgendes geschrieben:

also ich sthe vor einem großen loch und keine plan


in ein großen Loch paßt viel rein: 8)
schau es dir in ruhe an und frag die Onlinehilfe erstmal um rat, sonst stell gezielt fragen
ausblenden volle Höhe Quelltext
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:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs,Contnrs, StdCtrls;

type
  TMyObjekt = class
  private
  protected
  public
    Name        : string;
    ausgewaehlt : boolean;
    blablaS     : string;
    blablaI     : integer;
    constructor Create;
  published 

  end;

  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button_add: TButton;
    Button_Save: TButton;
    Button_load: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button_addClick(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ListBox1KeyPress(Sender: TObject; var Key: Char);
    procedure Button_SaveClick(Sender: TObject);
    procedure Button_loadClick(Sender: TObject);
  private
    { Private-Deklarationen }
    MyObjectlist : Tobjectlist;
    Procedure AddNewObjekt(_Name,_blablaS:string;_ausgewaehlt:boolean;_blablaI:integer);
    Procedure UpdateListbox;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyObjekt }

constructor TMyObjekt.Create;
begin
  inherited;
  Name        := '';
  ausgewaehlt := false;
  blablaS     := '';
  blablaI     := 0;
end;

{ TForm1 }

procedure TForm1.AddNewObjekt(_Name, _blablaS: string;_ausgewaehlt: boolean; _blablaI: integer);
Var Myobjekt:TMyObjekt;
begin
  myobjekt:=TMyObjekt.create;
  //objekte werden bei Objektlistze wieder freigegeben
  with MyObjekt do
    begin
      Name := _Name;
      ausgewaehlt := _ausgewaehlt;
      blablaS := _blablaS;
      blablaI := _blablaI;
      MyObjectlist.add(Myobjekt);
    end;
  UpdateListbox;  
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  MyObjectlist := TObjectList.Create(true);    //true ist wichtig, Liste gibt mit clear Objekte selbst frei
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyObjectlist.free;     
end;

procedure TForm1.UpdateListbox;
var i:integer;
begin
  //listbox neu aufbauen
  Listbox1.clear;
  for i:=0 to MyObjectlist.Count-1 do
    begin
      if (MyObjectlist.Items[i] is TMyObjekt) then
        begin
          listbox1.additem((MyObjectlist.Items[i] as TMyObjekt).Name,MyObjectlist.Items[i]);
        end;
    end;
end;

procedure TForm1.Button_addClick(Sender: TObject);
begin
  //ein Beispiel hinzufügen
  AddNewObjekt('test'+inttostr(random(100)),'',false,random(100));
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);
Var myobjekt:Tmyobjekt;
begin
  with Control as TListBox do
    begin
      if (Items.Objects[index] is TMyObjekt) then
        begin
          myobjekt:=Items.Objects[index] as TMyObjekt;
          //hintergrundfarbe festlegen
          canvas.brush.color:=clwindow; //erstmal immer weiß
          if myobjekt.ausgewaehlt then canvas.brush.color:=clltgray;    //bereits ausgewählt->hellgrau
          if odselected in State then canvas.brush.color:=clhighlight;  //Irtem selektiert
          if (odselected in State) and (myobjekt.ausgewaehlt) then canvas.brush.color:=clgray; //item selektiert und ausgewählt

          Canvas.FillRect(rect);

          //Texte ausgeben
          canvas.TextOut(rect.left+2  ,rect.Top+2,myobjekt.Name);
          //+80, fest, nur als Bsp für weitere Inhalte von Myobject
          canvas.TextOut(rect.left+80 ,rect.Top+2,inttostr(myobjekt.blablaI));          
        end;
    end;
end;

procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
  if key=chr(vk_return) then
    begin
      with Sender as Tlistbox do
        begin
          if itemindex<>-1 then
            begin
              //ausgewählt ändern
              if (MyObjectlist.Items[itemindex] is TMyObjekt) then
                begin
                  //der Listbox wurden die Objekte mit Additem übergeben
                  //nur der "Zeiger" auf die Objekte der Objectliste. Änderungen der Objectliste wirken sich damit auch automatisch auf das Listbox 
                  (MyObjectlist.Items[itemindex] as TMyObjekt).ausgewaehlt := true;
                  repaint; //neu zeichnen
                end;
            end;
        end;
    end;
end;

procedure TForm1.Button_SaveClick(Sender: TObject);
Var Stream:Tstream;
    i:integer;

begin
  stream:=TFileStream.Create('d:\Temp\test1.txt',fmcreate);
  with Twriter.Create(stream,1024) do
    try
      writeinteger(MyObjectlist.count-1); //anzhal der Elemente speichern
      for i:=0 to MyObjectlist.count-1 do
        begin
          if (MyObjectlist.Items[i] is TMyObjekt) then
            begin
              with (MyObjectlist.Items[i] as TMyObjekt) do
                begin
                  WriteString(name);
                  WriteBoolean(ausgewaehlt);
                  WriteString(blablaS);
                  WriteInteger(blablaI);
                end;
            end;
        end;
    finally
      free;
    end;
  stream.free;

end;

procedure TForm1.Button_loadClick(Sender: TObject);
Var Stream:Tstream;
    i,len:integer;
    myobjekt:TMyObjekt;
begin
  stream:=TFileStream.Create('d:\Temp\test1.txt',fmopenread);
  MyObjectlist.Clear;
  with Treader.Create(stream,1024) do
    try
      len:=readinteger; //Größe auslesen
      for i:=1 to len do
        begin
          //objekte einzeln auslesen
          myobjekt:=TMyObjekt.create;
          MyObjekt.name:=readstring;
          MyObjekt.ausgewaehlt:=ReadBoolean;
          MyObjekt.blablaS:=ReadString;
          MyObjekt.blablaI:=ReadInteger;
          MyObjectlist.add(myobjekt);
        end;
    finally
      free;
    end;
  stream.free;
  UpdateListbox;
end;

end.

ich hab noch nicht viel mit einer Objektliste gearbeitet, wenn jemand hier große Schnitzer sieht, kann er sich ja mal bitte melden.

es fehlen z.B. im Code noch n paar try except-blöcke und beim Laden und Speichern werden auch nicht alle Fehler abgefangen.

Der Code ist halt ein Beispiel, wie du vorgehen kannst. Statt der listbox kannst du auch ein listview verwenden, für die Anzeige der daten sicherlich besser. das Tmyobjekt ist auch ein beispiel und kann problemlos erweitert werden

kurz zur erklärung: du hast ein Objekt Tmyobjekt erzeugst für jede "Zeile" eine instanz und verwaltest diese dann in der Objektliste.
Änderung/zugreifen tust du immer auf diese Objekte. Der Listbox fügst du dann einträge mit diesen Objekten hinzu. Ein Speichern/Laden ist auch mitdabei.

welche Delphi-version hast Du? ich habs mit D6pro gemacht und bei D5Std. gibts noch kein listbox.additem, geht aber zu lösen

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
patrick dee Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 311

Win 98SE, WinXP
D3,D6
BeitragVerfasst: Mi 08.01.03 08:09 
wow

du hast dir viel mühe gemacht da muß ich mich ersteinmal durch wühlen.
Ich habe delphi 3 und delphi 6

danke. ne menge code für eine zeile grau machen in einer listbox hätte ich nicht gedacht.

ciao

patti

_________________
Glauben heißt nichts wissen ...