| Autor |
Beitrag |
patrick dee
      
Beiträge: 311
Win 98SE, WinXP
D3,D6
|
Verfasst: 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 
_________________ Glauben heißt nichts wissen ...
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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 
      
Beiträge: 311
Win 98SE, WinXP
D3,D6
|
Verfasst: Mo 06.01.03 10:43
hi
laden der listbox :
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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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 
      
Beiträge: 311
Win 98SE, WinXP
D3,D6
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Di 07.01.03 09:03
klar gekommen?
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
patrick dee 
      
Beiträge: 311
Win 98SE, WinXP
D3,D6
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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:
schau es dir in ruhe an und frag die Onlinehilfe erstmal um rat, sonst stell gezielt fragen
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 
      
Beiträge: 311
Win 98SE, WinXP
D3,D6
|
Verfasst: 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 ...
|
|