Autor Beitrag
MATHEBUG
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 05.08.04 17:56 
Hallo...ich bin zwar noch ein kleiner Newbie in Sachen Delphi...aber ich hoffe, dass ihr mir weiterhelfen könnt. Denn ich sitze schon seit Tagen an einem für mich recht schwierigen Problem.
Wie oben im Titel geschrieben handelt es sich um die Programmierung des Spiels die Türme von Hanoi und deren grafischer Darstellung.

Dazu habe ich ein Formular mit 3 Panels als symbolische Türme. Darauf befinden sich dann die Steine, welche wiederum panels sind. Diese werden mir dann je nach eingegebener Anzahl auch angezeigt.

Mein Problem liegt nun in der Anwendung des dafür schon vorhandenen Algorithmuses. Bisher habe ich drei Arrays erstellt, wobei jedes einem Turm zugeordnet ist. In diesen Arrays möchte ich die Steine sortieren und nach jedem neuen Schritt dies grafisch ausgeben. Nur weiß ich auch nicht, wie ich die Panels ansprechen bzw. verschieben könnte.

Wäre wirklich super, wenn ihr mir ein wenig helfen könntet, da ich solangsam aber sicher verzweifle.
Freue mich auf eure AW,

Grüße Mathebug


Moderiert von user profile iconPeter Lustig: Topic aus Windows API verschoben am Thu 05.08.2004 um 18:01
heinze
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 112

XP
D4 Prof
BeitragVerfasst: Do 05.08.04 20:29 
Die Panels spricht man wie alles andere an:
Panel1.left:=100; :position von Links
Panel1.top:=100; :position von oben
panel1.visible:=false; :sichtbar (true) und unsichtbar(false) machen.

Nach was willst du den die Araays sotieren lassen?
Sind Zahlen drin?
Ich Bins
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 197

Win XP Prof
D5 Prof
BeitragVerfasst: Do 05.08.04 21:52 
Soll das Programm dir die Lösung Schritt für Schritt grafisch zeigen oder willst du selber spielen?

_________________
Diese Nachricht wurde mit einer Taschenlampe in das offenliegende Ende eines Glasfaserkabels gemorst!
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 06.08.04 10:43 
Ich habe es gestern doch noch hinbekommen, dass ich ein Protokoll über die Steine Position der Steine angelegt habe. Dort steht drin, welcher Stein von welchem Turm zu welchem Turm verschoben werden muß. Bsp: Turm1-->Turm2. Darüber lasse ich auch meine Arrays verändern. Das bedeutet, dass ich über If und For Schleifen nach dem letzten Element im Array suchen lasse und das dann entsprechend verschiebe. Soweit funzt das nun auch alles recht super. Jetzt muß ich nur noch meine Panels bei jedem Schritt mit verschieben. Dabei danke ich dir @heinze erstmal für deine Hilfe. Denn ich glaube, mit deiner Lösung wird das ganz gut funktionieren. Somit hätte ich dann erstmal meine grafische automatische Lösung.

Wie funktioniert das dann, wenn ich eine manuelle Lösung mit verschieben der Steine machen möchte?
Dann müßte ich das ja per drag and drop machen. Aber ich hab keine Ahnung wie das geht. Zumindest noch nicht ;).
Also Die Steine müßten dann jeweils an das unterste Panel andocken...so stelle ich mir das vor. Oder gibt es da eine besser Lösung ?

Schonmal vielen Dank für Eure schnelle und kompetente Hilfe,

Grüße Mathebug


P.S.: Wenn mein Progi fertig ist, kann ich es ja mal hier posten oder so ;)
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 06.08.04 11:31 
...und noch ein Problem, was sich gerade eröffnet hat.

Also ich habe meine Scheiben (Panels) von Scheibe1 bis Scheibe31 benannt. Wie kann ich nun über einen Parameter i, das i-te Panel ansprechen. Also z.B.: Scheibe[i]:= "irgendwas". Mein Formular hab ich Tableau genannt und meine dazugehörige Unit main. Wenn ich nun in der main - Unit ein Array namens Scheibe deklariere und nun versuche ein Panel im Formular anzusprechen, bringt er mir den Fehler unbekannter Parameter.


Bin für jede Hilfe dankbar,


Grüße Mathebug
heinze
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 112

XP
D4 Prof
BeitragVerfasst: Fr 06.08.04 17:07 
für die schleife gibts ne function findcomponent, am besten tu mal nach "delphi fundgrube" googeln und tu dan nach bla suchen.
mit dem drag and drop is so ne sache, ich hab auch schon mal sowas gemacht, wie genau schreib ich später oder du gibts mir deine e-mail addrese per pn und ich schick dir den quelltext als textdatei, was fürn ein Delphi hast du den?
dognews
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 06.08.04 21:35 
hey? warum nimmst du eigentlich panels? warum nicht einfach Grafiken?
du setzt einfach 3x4 TImages auf dein Formular und dein Programm zeigt dann je nach dem, welchen "Stein" du gerade haben willst in das TImage....
so hättest du dann auch dein Problem mit dem Ansprechen gelöst:

ausblenden Quelltext
1:
image1_1.Picture.LoadFromFile('stein_'+groesse);					

oder so ähnlich...

da kannst dus ja auch gleich nach der größe sortieren...


wenn das mit den drag and drop nicht klappen sollte, dann kannst du das ja auch einfach mit klicks machen... - also klick auf Stein => klick auf Turm...

also ich hätte dann auf jeden Fall interesse an deinem Programm! :wink:
(bin schon gespannt, wie das aussieht)

mfg,
dognews :D
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 07.08.04 11:55 
Ich habe Delphi 6.0, nun mit den Panels ging das bisher eigentlich recht gut. Mit den TImages habe ich noch nicht gearbeitet und kenne mich mit den Komponeten nur wenig aus.
Um auf die Panels zugreifen zu können, kann man ja das Delphi ein wenig "verar...", indem man die Arrays vom Typ TPanel deklariert. Das funzt auch mit dem Debugger. Ich wollte nämlich dann die Nummern im Tag schreiben. Nur wenn man dann im Programm ausführt, bringt er einen hübschen Speicheradressfehler. Ist ja auch irgendwie logisch, weil man mit einem Array nicht auf einen Integerwert (Tag) zugreifen kann.

Mit der findcomponent Methode werde ich es mal versuchen.

Grüße Mathebug
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 07.08.04 20:15 
Mit der Findcomponent - Methode funzt es auch nicht. Zu Findcomponent sagt er mir unbekannter Bezeichner. Selbst wenn ich die function in der Unit deklariere...oder mach ich da was falsch ??? Bitte poste mir mal ein Bsp..

Ach ja, mit den TImages würde es auch nicht besser funktionieren. Denn auch da müßte ich dann auf das i-te Element, also das i-te Image zugreifen können. Da würde er mir sicherlich einen ähnlichen Fehler bringen, oder?

Grüße Mathebug
heinze
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 112

XP
D4 Prof
BeitragVerfasst: Sa 07.08.04 21:39 
Mal ohne garantie
laute delphi fundgube funzt das so :

For i:=1 to 27 do
(FindComponent('Edit'+IntToStr(i)) as TEdit).text := 'bla';

auf Panels müste es dan etwa so sein :

For i:=1 to 27 do
(FindComponent('Panel'+IntToStr(i)) as TPanel).left := 100;

aber wie gesagt, ohne garantie.

hast du dir sie runtergeladen? Als anfänger würde ich dir empfehlen ein paar FAQ zu "sammeln" oder mal
/* bischen werbung mach
bei ebay ein paar bücher zu kaufen, da bekommt bücher was normal 50 € kosten schon für unter 10 €
/*bischen werbung mach ende
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 09.08.04 12:30 
Die Funktion FindComponent hat nicht funktioniert, weil ich meine Panels schon zu begin der Laufzeitumgebung auf meinem Formular hatte und die dann nur über visible sichtbar gemacht habe. Nun hab ich es über den Construktor .create gemacht und es funktionierte...vorerst jedenfalls.

Wenn ich nun die einzelnen panels über eine andere unit ansteuern möchte, um die Farbe zu ändern, funktioniert die for to do schleife nicht. Der Compiler bringt zwar keine Fehlermeldung, aber beim Aufruf im Progi kommt dann Speicheradressfehler mit EAccessViolation und Listerror.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
For i:=1 to Anzahl do
begin
main.Scheibe:=TPanel(FindComponent('Scheibe'+IntToStr(i)));
main.Scheibe.Color:= farb.Panel1.Color;
end;


Wenn ich diese Schleife verwende kommt der besagte Fehler (je nachdem, wie ich den Quelltext in der Schleife variiere).
Sage ich aber ohne die Schleife nur:
ausblenden Delphi-Quelltext
1:
main.Scheibe.Color:= farb.Panel1.Color;					


...dann funktioniert es....aber dann ändert sich nur die Farbe des letzten Panels :(.

Das Ansprechen des i-ten Panels über die For to do schleife geht auch nicht in meinen For und if Anweisungen, da kommt dann wieder der Fehler mit unbekannten Bezeichner.

Woran kann das liegen ? Bei der Variablendeklaration hab ich keine Beschränkungen in den Berechtigungen.

Ich werde nun mal versuchen die Sache über Images mit Canvas zu lösen.
Denn es muß doch möglich sein mit einer Komponenten von Delphi einen vernünftigen Zugriff auf alle erstellten Objekte zu erhalten....oder ich stell mich zu "blöd" an ;).


Grüße Mathebug

Woran kann das liegen ?
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 09.08.04 17:05 
EDIT:

So...also bei meinen Aufrufen der Panels über die For to do - Schleife oder auch generell beim Zugriff von anderen Units bricht er mir im Programm mit EAccessviolation ab, obwohl das Programm fehlerfrei compiliert werden kann.

Hab ich vielleicht vergessen ein Attribut zu setzen, oder eine Einstellung zu machen ?

Hier mal die Eigenschaften aus meiner .Create Anweisung:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
main.Scheibe:=TPanel.Create(Tableau);
main.Scheibe.Parent:=Tableau;
main.Scheibe.Name:='Scheibe'+IntToStr(i);
main.Scheibe.SetBounds(left,top,width,height);
main.Scheibe.Color:= farb.Panel1.Color;
main.Scheibe.Caption:= '';


Grüße Mathebug

P.S.: Schonmal Danke für Eure Hilfe :)
heinze
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 112

XP
D4 Prof
BeitragVerfasst: Di 10.08.04 12:19 
wie gesagt, kombiniert gehts nicht meines wissens also das man mit findcomponent ein label oder sonstiges auf nem anderen Forumlar ansteuert. Warum machst du nicht alles auf einem Formular?

Wieso erzeugst du die teile eigentlich zur laufzeit?
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 10.08.04 19:04 
Also generell erstelle ich ja die Panels auf einem Formular. Der Zugriff von einem anderen Formular auf dieses ist nur nötig, weil ich noch eine Option drin hab, womit man die Farbe der Panels und des Formulars etc. ändern kann.
Die Panels erstelle ich deshalb zur Laufzeit, weil man dadurch die Anzahl der Panels beliebig mit der Größenänderung der Panels erhöhen kann. Wenn meine Panels schon fest vorgegeben sind, kann ich zwar die Farbe problemlos ändern, aber der Befehl Findcomponent funktioniert nicht.

Da dies mein erstes großes Projekt mit Delphi ist, bin ich schon ziemlich enttäuscht, dass es nicht mit einem einfachen Befehl möglich ist, die Attribute der Komponenten zu ändern und sie über Schleifen anzusprechen. Schließlich ist der Rest schon fertig únd ich muß nur noch die Scheiben implementieren und verschieben.

Danke für deine Mühe,

Grüße Mathebug
MATHEBUG Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 10.08.04 20:07 
Ich bin sehr glücklich, dass ich mein Problem nun endlich gelöst hab. Wie immer lag es am Programmierer, oder der komplizierten Programmiersprache. Vielleicht versteht ihr, was ich meine, wenn ihr euch den folgenden Quelltext anschaut.
Mit der Methode Findcomponents geht es wunderbar. Nur muß man über TComponents ansprechen !!!
Hier erstmal der Quelltext:

ausblenden Delphi-Quelltext
1:
Scheibe:=TPanel(main.Tableau.FindComponent('Scheibe'+IntToStr(y)));					


Man deklariere Scheibe vom Typ TPanel. Dann sucht man über Findcomponents nach der mit dem Construktor erstellten Methode (.create) nach der entsprechenden Scheibe.
Wichtig ist hierbei, dass der Befehl Findcomponents erst über die Unit (main) dann über das Formular (Tableau) aufgerufen werden kann. Das TPanel am Anfang spezifiziert die TComponent Componenten auf dem Formular, deren Namen durchsucht werden soll.

Ich habe noch nie solange nach einer Lösung suchen müssen wie diesmal. Vorallem, wenn die Lösung nur eine kleine Programmzeile beinhaltet, mit der alles weitere aufzurufen geht. Denn nun kann man über Scheibe."irgendwas" auch die Attribute ansteuern. Der Aufruf ist auch aus anderen Units möglich. Ach ja, in meinem Delphi Buch hab ich das nicht finden können und die Delphi Hilfe ist da auch nicht besonders. Naja, ich denke, dass nicht nur ich ein wenig schlauer geworden bin *lol*.

Nochmal danke ich euch allen für eure Hilfe.
Mein Problem ist gelöst...somit wird mein Progi bald fertig sein :).

THX,

Grüße Mathebug