Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 13.10.09 16:32
Hi, kann mir jemand sagen wie ich es evtl einfacher hinbekomme, das man nicht,(in diesem Beispiel 4x),
immer das selbe schreiben muss bzw. bei Veränderungen die mann in einem macht, nun auch bei den anderen source auch zu machen.
Fehler sind da nicht mehr ausgeschlossen bei den schlechten Codestill!! "Eigenkritik"
Ich gebe mal einen kleinen Einblick was ich meine:
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:
| if names = 'ScrollBox1' then begin if (exnames = '') then PlayList1.Add(dateiname) else PlayList1.Insert(strtoint(exnames)-1+i, dateiname);
names:='PlayList1';
end else if names = 'ScrollBox2' then begin
if (exnames = '') then PlayList2.Add(dateiname) else PlayList2.Insert(strtoint(exnames)-1+i, dateiname);
names:='PlayList2'; end else if names = 'ScrollBox3' then begin
if (exnames = '') then PlayList3.Add(dateiname) else PlayList3.Insert(strtoint(exnames)-1+i, dateiname);
names:='PlayList3'; end else if names = 'ScrollBox4' then begin
if (exnames = '') then PlayList4.Add(dateiname) else PlayList4.Insert(strtoint(exnames)-1+i, dateiname);
names:='PlayList4'; end; StrDispose(Dateiname);
end;
DragFinish(Msg.WParam);
if names = 'PlayList1' then begin
PlayList1.SaveToFile(PathProjekt+names+'.lst');
for i := 0 to playlist1.Count -1 do begin PlayGauge := TGaugeCaption.create(ScrollBox1); with PlayGauge do begin Name := 'ScrollBox1_'+inttostr(i+1); Caption := ExtractFileName(playlist1.Strings[i]);
backColor := clInfoBk; OnMouseDown := form1.ScrollBox1MouseDown;
PopupMenu := form1.PopupMenu1; OnClick := Form1.ScrollBox1Click; Top := (i)*(playgauge.Height+5); Parent := ScrollBox1; show; end; end; end else if names = 'PlayList2' then begin label1.caption:=names; PlayList2.SaveToFile(PathProjekt+names+'.lst'); for i := 0 to playlist2.Count -1 do begin PlayGauge := TGaugeCaption.create(ScrollBox2); with PlayGauge do begin Name := 'ScrollBox2_'+inttostr(i+1); Caption := ExtractFileName(playlist2.Strings[i]);
backColor := clInfoBk; OnMouseDown := form1.ScrollBox1MouseDown;
PopupMenu := form1.PopupMenu1; OnClick := Form1.ScrollBox1Click; Top := (i)*(playgauge.Height+5); Parent := ScrollBox2; show; end; end; end else if names = 'PlayList3' then begin PlayList3.SaveToFile(PathProjekt+names+ '.lst'); for i := 0 to playlist3.Count -1 do begin PlayGauge := TGaugeCaption.create(ScrollBox3); with PlayGauge do begin Name := 'ScrollBox3_'+inttostr(i+1); Caption := ExtractFileName(playlist3.Strings[i]);
backColor := clInfoBk; OnMouseDown := form1.ScrollBox1MouseDown;
PopupMenu := form1.PopupMenu1; OnClick := Form1.ScrollBox1Click; Top := (i)*(playgauge.Height+5); Parent := ScrollBox3; show; end; end; end else if names = 'PlayList4' then begin PlayList4.SaveToFile(PathProjekt+names+ '.lst'); for i := 0 to playlist4.Count -1 do begin PlayGauge := TGaugeCaption.create(ScrollBox4); with PlayGauge do begin Name := 'ScrollBox4_'+inttostr(i+1); Caption := ExtractFileName(playlist4.Strings[i]);
backColor := clInfoBk; OnMouseDown := form1.ScrollBox1MouseDown;
PopupMenu := form1.PopupMenu1; OnClick := Form1.ScrollBox1Click; Top := (i)*(playgauge.Height+5); Parent := ScrollBox4; show; end; end; end; |
Wie gesagt, das setzt sich bei dragdrop und anderen proceduren so fort.
Nun Währe es schön wenn mir jemand bischen helfen würde das zu vereinfachen.
Habe natürlich selbst auch schon probiert, aber keine Ideen mehr(mit eigener func. Procedure usw.)
Im Enteffekt steht dort das selbe wieder drin wie gezeigt.
Gruss
ALF Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Di 13.10.2009 um 18:22
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Hugo343
      
Beiträge: 114
Erhaltene Danke: 2
Windows 7
Turbo Delphi, Dev C++
|
Verfasst: Di 13.10.09 16:52
Ich könnte vielleicht ein Teilproblem lösen:
Du fragst ja immer nach 'Scrollbar1','Scrollbar2' usw. Das könntest du ja auch durch eine For-Schleife ersetzen:
Delphi-Quelltext 1: 2: 3: 4:
| for I := 1 to 4 begin if names='Scrollbar'+inttostr(i) then end; |
Oder muss das zwingend mit ELSE sein?
Wär nur so ne Idee  .
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 13.10.09 17:04
Danke für die Antwort.
Hilft aber nicht weiter, weil danach ja doch wieder die if abfragen kommen!!
Problem ist ja nicht das sondern, die jeweilige Zuweisungen!!!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| PlayGauge := TGaugeCaption.create(ScrollBox1); PlayGauge := TGaugeCaption.create(ScrollBox2); oder...
Parent := ScrollBox1; Parent := ScrollBox2; usw. .... |
Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
martin300
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Di 13.10.09 17:12
Die Lösung dafür sind Methoden. Dort schreibst den Code 1x hin und rufst nur noch die Methode mit entsprechenden Parameter auf.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 13.10.09 17:23
Thx
muss aber offen gestehen, hab mit methoden noch nie gearbeited.
Die delphi hilfe ist da auch nicht sehr hilfreich!
Für meinen Fall, mhh..  bischen code  , währe sehr hilfreich!??
Gruss
Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Hugo343
      
Beiträge: 114
Erhaltene Danke: 2
Windows 7
Turbo Delphi, Dev C++
|
Verfasst: Di 13.10.09 17:40
Oh doch die Delphi Hilfe gibt Antworten! ^^ Suchbegriff: "Methoden" = (ich zitiere) "Eine Methode ist eine Prozedur oder Funktion, die zu einer bestimmten Klasse gehört. Daher wird beim Aufruf einer Methode das Objekt (bzw. bei einer Klassenmethode die Klasse) angegeben, mit dem die Operation durchgeführt werden soll. SomeObject.Free ruft beispielsweise die Methode Free in SomeObject auf.". Ich denke wenn ich
Delphi-Quelltext 1: 2: 3:
| procedure TForm1.OnCreate; function TForm1.blaaa |
habe ist das eine Methode. Für mich wäre eine Prozedur hier ganz nett ^^. <--- lululu-ich-noob ^^
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 13.10.09 17:46
so kannst du eigene Methoden deklarieren:
Delphi-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:
| interface type TForm1=class(TForm) private
public function MeineMethode(MeineZahl: Integer; ...;Variable: Typ) : Boolean end;
implementation
function TForm1.MeineMethode(MeineZahl: Integer; ...;Variable: Typ) : Boolean; begin if MeineZahl = 1 then begin doSth; Result := False; end; Result := Variable = Value; end;
TForm1.Btn1OnClick(Sender: TObject); begin MeineMethode(23, Value); end; |
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 13.10.09 18:16
Sorry !!!
Glaube ich wittere ein Missverständnis! oder ich stehe neben mir
Es geht nicht um selbst erstellte Funktionen oder Proceduren. Das ist ja nicht das Problem!
Mir geht es, darum das ganze zu vereinfachen!
Mein Problem dabei ist, das man bei der Zuweisung : z.B.
Delphi-Quelltext 1: 2: 3: 4:
| PlayGauge := TGaugeCaption.create(ScrollBox2); ..... ..... Parent := ScrollBox2; |
Wobei:
Scrollbox1 -4 keine Variable sondern Komponente ist.
An den Stellen wo das hin muss, wie im code gezeigt, kann man ebend keine Variable einsetzen!
Es sei den es gibt dafür auch andere Möglichkeiten, aber welche!?
denn dann währe alles leicht zu coden und man braucht das ganze nur einmal.
Hab aber keine idee!!  sorry.
Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Apuch
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Di 13.10.09 18:42
Um anhand des Objektnamens den die Komponente zu finden, gibts die Prozedur FindComponent. Einfach mal in die Hilfe schauen. Um alles etwas eleganter zu gestalten, kann man das ganze ja in ein Feld ablegen...
In Etwa so:
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:
| ... interface type TForm1=class(TForm) private MyScollBoxes : array [1 .. 4] of TScrollBox; ScrollBoxNames : TStringList; PlayLists : array [1 .. 4] of TPlayList; ...
procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin ScrollBoxNames := TStringList.Create(); for i := 1 to 4 do begin ScrollBoxNames.Add('PlayList'+inttostr(i)); PlayLists[i] = FindComponent('PlayList'+inttostr(i)); MyScollBoxes[i] := FindComponent('ScrollBox'+inttostr(i)); end; end;
procedure ... var index : integer; begin if not ScrollBoxNames.Find(names, index) then exit; if (exnames = '') then PlayLists[index].Add(dateiname) else PlayLists[index].Insert(strtoint(exnames)-1+i, dateiname); names := PlayLists[index].Name; end; DragFinish(Msg.WParam);
PlayLists[index].SaveToFile(PathProjekt+names+'.lst');
for i := 0 to PlayLists[index].Count -1 do begin PlayGauge := TGaugeCaption.create(ScrollBoxes[index]); with PlayGauge do begin Name := ScrollBoxes[index].Name + '_' + inttostr(i+1); Caption := ExtractFileName(playlists[i].Strings[i]);
backColor := clInfoBk; OnMouseDown := form1.ScrollBox1MouseDown; PopupMenu := form1.PopupMenu1; OnClick := Form1.ScrollBox1Click; Top := (i)*(playgauge.Height+5); Parent := ScrollBoxes[index]; show; end; end;
end; |
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 13.10.09 19:04
Hi, danke, danke danke für die vielen Hinweise!!!
Aber es gibt doch ein Missverständnis
Die 4 fachen if Anweisungen, also immer der gleiche Inhalt kommen ja nur zustande
zB.
PlayGauge := TGaugeCaption.create( ScrollBox2]) //hier kann auch ScrollBox1 oder ScrollBox3 sein
...
Parent := ScrollBox2; //hier auch
usw.
dadurch habe ich das 4x drin. nicht, weil ich nicht weis wie man eine funktion oder procedure schreibt
oder Findcomponente nicht kenne!
Die Frage ist also:
Wie kann ich es machen das:
PlayGauge := TGaugeCaption.create( VARIABEL IST)
oder
Parent := VARIABEL IST ist. da man dort keine strings einfügen kann
Das ist mein Problem!!
ALF
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Apuch
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Di 13.10.09 19:17
Schau in die OnlineHilfe, dann kennst du FindComponent  .
Anhand des Names (woher du den auch immer bekommst) wird der Index festgestellt. Anhand des Indexes können die Komponenten aus einer hinterlegten Liste ausgewählt werden.
In meinem Code hab ich die in ein Array abgelegt. Find den Zugriff über diesen Umweg eleganter. In der FormCreate-Methode wird das Array befüllt. in deinem Code steht dann:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| if names = 'ScrollBox1' then parent := ScrollBox1; PlayGauge := TGaugeCaption.create(ScrollBox1); else if names = 'ScrollBox2' then parent := ScrollBox2; PlayGauge := TGaugeCaption.create(ScrollBox2); else if names = 'ScrollBox3' then parent := ScrollBox3; PlayGauge := TGaugeCaption.create(ScrollBox3); else if names = 'ScrollBox4' then parent := ScrollBox4; PlayGauge := TGaugeCaption.create(ScrollBox4); else Exit;
if not ScrollBoxNames.Find(names, index) then exit;
parent := ScollBoxes[index]; PlayGauge := TGaugeCaption.create(ScrollBoxes[index]); |
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 13.10.09 19:22
sorry Apuch
hab nicht alles gesehen nice.
Werd mich gleich dranmachen das umzucoden und zu sehen wo ich das alles einsetzen kann.
Gibt ja noch mehr code wo das ganze 4x in abgewandelter if Anweisung passiert.
THX Apuch
ach so wo die Strings herkommen!?
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:
| procedure TForm1.WMDROPFILES(var Msg: TMessage); var i, anzahl, size: Integer; names, exnames: string;
begin
inherited;
anzahl := DragQueryFile(Msg.WParam, DF_NUMBEROFFILES, Dateiname, 255); GetCursorPos(pos); exnames := copy(FindDragTarget(pos, False).name, 12, 3); for i := 0 to (anzahl - 1) do begin names := copy(FindDragTarget(pos, False).name, 0, 10); size := DragQueryFile(Msg.WParam, i, nil, 0) + 1; DateiName := StrAlloc(size); DragQueryFile(Msg.WParam, i, Dateiname, size);
if names = 'ScrollBox1' then begin if (exnames = '') then PlayList1.Add(dateiname) else PlayList1.Insert(strtoint(exnames)-1+i, dateiname);
names:='PlayList1';
end else if names = 'ScrollBox2' then begin ...... .... |
usw.
ALF
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 14.10.09 01:19
Du bekommst das Control direkt von FindDragTarget geliefert und statt dann direkt damit zu arbeiten nimmst du zuerst davon den Namen und suchst hinterher wieder genau das Control dazu?!?
(Mal abgesehen davon, dass die Bezeichnung der Komponenten nicht besonders aussagekräftig ist.  )
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 14.10.09 08:43
Ich werfe mal das hier in den Raum:
Delphi-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:
| var Scrollbox: TScrollbox; Playlist: TPlaylist; begin if names = 'ScrollBox1' then begin Scrollbox := Scrollbox1; Playlist := Playlist1; end else if names = 'ScrollBox2' then begin Scrollbox := Scrollbox2; Playlist := Playlist1; end else if names = 'ScrollBox3' then begin Scrollbox := Scrollbox3; Playlist := Playlist1; end else raise EApocalypseException('Something happened that should not be possible. Change the programmer and try again.')
if (exnames = '') then PlayList1.Add(dateiname) else PlayList1.Insert(strtoint(exnames)-1+i, dateiname);
GaugeCaption := TGaugeCaption.Create(Scrollbox); |
Oder so ... mit Finscomponent könnt eman das am Anfang noch kürzen, aber das mit der variable sollte klar werden 
|
|
jaenicke
      
Beiträge: 19321
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 14.10.09 08:50
Wozu überhaupt sowas oder FindComponent, wenn die Komponente selbst bereits vorhanden ist. Wie gesagt: Es bringt doch nix zuerst den Namen der Komponente zu nehmen und daraus wieder die Komponente zu suchen. 
|
|
Apuch
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Mi 14.10.09 12:22
Die Komponente selbst ist bekannt. Mit dieser Komponente sind jedoch auch andere Felder verknüpft...(Playlist, Scrollbox, etc.). Vielleicht sollte man die in ein Record packen. Dieses record kommt dann in eine Liste und als Schlüssel nimmt man den Namen^^ Oder gibts unter Delphi sowas wie Userdata? Konnte man nicht tag zum speichern eines Schlüssels missbrauchen?
MfG
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 14.10.09 16:24
Hi,
danke nochmal für die Hinweise! leider funct es doch noch nicht so mit FindComponent!
Was die Komponenten betrifft, hier mal das ganze.
TForm1 <-TForm
-in der Form
GroupBox 1-4 <- TGroupBox
-in der jeweiligen GroupBox dann die
ScrollBox 1-4 <- TscrollBox
-in der jeweiligen ScrollBox die Gauges, sie werden mit DRAGDROP eingefügt,verschoben usw. und werden erst zur Laufzeit erstellt!!!!
PlayGauge 1-x <- TGaugeCaption abgeleited von Tgauge;
PlayList ist klar was die beinhalted
PlayList 1-4 <- TStringlist
Mit Findcomponent geht es nur bedingt da PlayList von TStringList kommt und keine kennung hat demzufolge auch nicht von FindComponent über den Namen gefunden werden kann!
Es sei ich erstelle ein neuen Type von TStringList mit zusatz Methode Name für die Identifikation!!??
OMG...
Ihr seht im Prinzip simple, aber...., wenn man weis wie man die ganzen Abfragen Vereinfachen kann ohne alles 4x zu machen.
Dies ist ja mein Problem!!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Apuch
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Do 15.10.09 01:02
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:
| ...
TListItem : record GroupBox : TGroupBox; ScrollBox : TScollBox; PlayList : TStringList; end;
...
TForm1=class(TForm) private MyItems ; array [1 .. 4] of TListItem; ...
procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin ScrollBoxNames := TStringList.Create(); for i := 1 to 4 do begin MyItems[i].GroupBox := FindComponent('GroupBox' + inttostr(i)); MyItems[i].ScrollBox := FindComponent('ScrollBox' + inttostr(i)); MyItems[i].PlayList := TStringList.Create(); MyItems[i].ScrollBox.Tag := i; end;
... end;
...
procedure TForm1.WMDROPFILES(var Msg: TMessage); var index, i, anzahl, size: Integer; exnames: string; begin inherited; anzahl := DragQueryFile(Msg.WParam, DF_NUMBEROFFILES, Dateiname, 255); GetCursorPos(pos); exnames := ???
for i := 0 to (anzahl - 1) do begin index := FindDragTarget(pos, False).tag; size := DragQueryFile(Msg.WParam, i, nil, 0) + 1; DateiName := StrAlloc(size); DragQueryFile(Msg.WParam, i, Dateiname, size);
if (exnames = '') then PlayList1.Add(dateiname) else MyItems[index].PlayList.Insert(strtoint(exnames)-1+i, dateiname); names := 'PlayList' + inttostr(i); end; ... |
So in etwa. Den Zusammenhang mit FindDragTarget durchsteig ich aus Unkenntniss nicht. Sieht aber allgemein erstmal unsauber in deinen Codxe aus:
Delphi-Quelltext 1: 2:
| exnames := copy(FindDragTarget(pos, False).name, 12, 3); names := copy(FindDragTarget(pos, False).name, 0, 10); |
Durchsteig ich nicht und du in 6 Monaten auch nicht mehr... Das muss irgendwie eleganter gehen. Angefangen damit, das du bessere Namen für deine Komponenten findest. ScollBox ist einfach nicht eindeutig genug. PlayList ein Anfang..
MfG
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Fr 16.10.09 19:10
So hier mal meine Lösung des ganzen!!
Ich weiss es ist nicht der SuperCode!!!
aber er funct und ist nicht mehr so aufwendig wie mein erster!
und ich kann nun über den "index" alles weitere im Programm steuern.
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:
| .... .... type TForm1 = class(TForm)
... ScrollBox1: TScrollBox; ScrollBox2: TScrollBox; ScrollBox3: TScrollBox; ScrollBox4: TScrollBox; ... protected procedure WMDROPFILES(var Msg: TMessage); message WM_DROPFILES;
private MyScrollBoxes : array [1 .. 4] of TScrollBox; ScrollBoxNames : TStringList; PlayList : array [1 .. 4] of TStringList;
..... .....
procedure TForm1.FormCreate(Sender: TObject); var j: Integer; begin ..... ..... DragAcceptFiles(Handle, True); ScrollBoxNames := TStringList.Create; ScrollBoxNames.Add('ScrollBox'); for j := 1 to 4 do begin ScrollBoxNames.Add('ScrollBox'+inttostr(j)); PlayList[j] := TStringList.create; PlayList[j].OnChange:=Form1.PlayListChange; MyScrollBoxes[j] := TScrollBox(FindComponent('ScrollBox'+inttostr(j))); end;
end;
procedure TForm1.WMDROPFILES(var Msg: TMessage); var i, anzahl, size: Integer; names, exnames: String;
begin
inherited; exnames:=''; anzahl := DragQueryFile(Msg.WParam, DF_NUMBEROFFILES, Dateiname, 255); GetCursorPos(pos); exnames := copy(FindDragTarget(pos, False).name, 12, 3); for i := 0 to (anzahl - 1) do begin names := copy(FindDragTarget(pos, False).name, 0, 10); size := DragQueryFile(Msg.WParam, i, nil, 0) + 1; DateiName := StrAlloc(size); DragQueryFile(Msg.WParam, i, Dateiname, size);
index:= ScrollBoxNames.IndexOf(names); if index < 0 then exit;
if (exnames = '') then PlayList[index].Add(dateiname) else PlayList[index].Insert(strtoint(exnames)-1+i, dateiname); names := 'PlayList'+inttostr(index); end;
StrDispose(Dateiname); DragFinish(Msg.WParam);
PlayList[index].SaveToFile(PathProjekt+names+'.lst'); for i := 0 to PlayList[index].Count -1 do begin PlayGauge := TGaugeCaption.create(MyScrollBoxes[index]); with PlayGauge do begin Name := MyScrollBoxes[index].Name + '_' + inttostr(i+1); Caption := ExtractFileName(playlist[index].Strings[i]);
backColor := clInfoBk;
OnMouseDown := form1.ScrollBox1MouseDown; PopupMenu := form1.PopupMenu1; OnClick := Form1.ScrollBox1Click; Top := (i)*(playgauge.Height+5); Parent := MyScrollBoxes[index]; show; end; end;
end; ..... .....
procedure TForm1.ScrollBox1Click(Sender: TObject); var gaugeindex, i, Scrollboxmitte: Integer; names: string;
begin GetCursorPos(pos);
names := copy(FindDragTarget(pos, False).name, 0, 10); index:= ScrollBoxNames.IndexOf(names); if index < 0 then exit; Scrollboxmitte:= MyScrollBoxes[index].Height div 2;
if (Sender is Tgaugecaption) then begin gaugeindex := (Sender as Tgaugecaption).ComponentIndex; for i := 0 to MyScrollBoxes[index].ComponentCount -1 do (MyScrollBoxes[index].Components[i] as Tgaugecaption).BackColor:=clInfoBk;
if (Sender as Tgaugecaption).top > Scrollboxmitte then MyScrollBoxes[index].VertScrollbar.Position:= MyScrollBoxes[index].VertScrollbar.Position + playgauge.Height+5; if (Sender as Tgaugecaption).top < Scrollboxmitte then MyScrollBoxes[index].VertScrollbar.Position:= MyScrollBoxes[index].VertScrollbar.Position - playgauge.Height+5;
(MyScrollBoxes[index].Components[gaugeindex] as Tgaugecaption).BackColor:=cllime;
end;
end; |
Nun werden wieder einige sagen, schlechter code, unübersichtlich, komponenten sind nicht ausagekräftig???
oder
man kann alles noch einfacher machen mh.......
Bitte her damit, ich bin für jede Kritik offen
nur dann bitte auch mit code.
Der einzigste der mir da den Ansatz gegeben hatt war Apuch
THX
Alles andere waren zwar nette Hinweise, wenn man aber nicht weiter kommt (ohne anderen code)
sind auch die besten Hinweise wertlos.
Trotzdem danke an alle
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Apuch
      
Beiträge: 27
Kubuntu 9.04, Win 2000
Delphi 7
|
Verfasst: Fr 16.10.09 19:45
Warum man den Komponenten einen eigenen Namen gibt und es nicht beim Standardnamen belässt? Welche der beiden folgenden Zeilen ist Aussagekräftiger?
Delphi-Quelltext 1: 2:
| rdbMouseactionPan.Checked := true; RadioButton1.Checked := true; |
Ich währe für die erste;) (Ein Radiobutton der irgendwas mit der Mausaktionen Pan zu tun hat wird aktiviert.. beim zweiten halt nur ein Radiobutton). Man benennt die Controls also aus dem selben Grund um wie man seine Variablen nicht a,b,c.... tauft -> bessere Lesbarkeit.
In deinem Projekt kann (!) es sein, das ScrollBox1..4 vollkommend ausreichend ist. Das aber nur wenn ScrollBox auch den Zweck beschreibt und eindeutig ist, was mit 1..4 gemeinst ist. Im Idealfall lese ich deinen Code und verstehe ohne nachragen was gemeinst ist.. wie gesagt, Idealfall. Praktisch ist das nur selten möglich. (Vor kurzen hat einer über Code von mir gesagt "kann man ganz gut lesen" ... ging runter wie Öl  ).
Als Faustformel gilt: Dont Repeat Yourself. Wenn du merkst, du kopierst Quellcode von anderen Stellen: Stopp, zurücklehnen, drüber nachdenken. Das geht in 98% der Fälle auch anders. Der gesamte Quellcode wird so kürzer, besser lesbar, einfacher wartbar und weniger Fehleranfällig. Was du ja am Anfang schon gesagt hast  Das an den entsprechenden Stellen zu sehen ist dann Übungssache...
Zu deinem Code:
- ich bn Fan von konsequent englischen Bezeichnern Scrollboxmitte:= MyScrollBoxes[index].Height div 2; wirkt wie Sprachgepansche in meinen Augen
- konsequent 1 Schrittweite benutzen (du hast mal 2, mal 4 mal 8 ...)
- Konstrukte wie (Sender as Tgaugecaption). ... Sollten nach möglichkeit nicht zu oft auftauchen. Dann lieber in ner separablen Variable Speichern.
- 80 Zeichen Seitenbreite ... wie es seit etwa 40 Jahren gilt
So genug gemeckert.. zum Schluss noch den Zen of Python (gilt aber auch für andere Programmiersprachen):
Zitat: |
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
|
Bei letzteren hat Delphi ein Problem ^^
MfG
_________________ DasLebenIstZuKurzFürWhitespaces!
|
|
|