Autor Beitrag
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 21.03.09 23:13 
Hallo liebe - immer wieder hilfreiche - Entwicklergemeinde!
Ich möchte gerne einfach nur ein paar Panels so wie Karten im Memory - aber erst mal nur 2 nebeneinander und sonst untereinander - platzieren.
Bisher habe ich das so da stehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i:=0 to Length(KartenArray)-1 do
        begin
        KartenArray[i].Top:=118*(i div 2);
        KartenArray[i].Left:=8+((i div 2)-1)
        end;

Das Kartenarray ist also ein Array von Panels mit den entsprechenden aufzudeckenden Images oder Labels drauf.

Dadurch bekomme ich aber nur die Karten untereinander angeordnet - also liegen die eigentlichen Spalten übereinander...
Aber die Reihen sehen doch vernünftig aus...

Wo ist denn da jetzt der Fehler?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 21.03.09 23:37 
Dir fehlt ein Faktor.
ausblenden Delphi-Quelltext
1:
KartenArray[i].Left:=8+((i div 2)-1);					
Ich vereinfache mal etwas:
ausblenden Quelltext
1:
2:
3:
8+((i div 2)-1)
= 8 + (i div 2) - 1
= 7 + (i div 2)
i wird immer eins größer. Du versetzt die Karten also jeweils einen halben Pixel weiter nach rechts. ;-)

Im Grunde musst du es nur machen wie bei Top, nur mit der 8 ggf. als Offset dazu.
ffgorcky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: So 22.03.09 18:05 
Hallo Jaenike,

Ja, ich sehe jetzt auch, dass ich aus meinen Überlegungen raus das ganze etwas zu kompliziert(/zu verschachtelt) gemacht habe...
Aber ich sehe jetzt leider doch noch nicht so ganz, wieso ich dadurch nur das zweite, das fünfte und das sechste Panel (von bisher insgesamt nur sechs Panels) sehen kann.
Die anderen liegen demnach unter denen...
...was sie ja nach einer Laufzeit-Überprüfung auch wirklich tun - also liegen immer zwei übereinander!

Ich möchte sie doch einfach nur mit einem Absand von 8 Pixeln zum Rand und zueinander (horizintal und vertikal) ansiedeln.
Aber das möchte ich gerne während der Laufzeit machen, da ich sie ja sonst nicht vorher mischen kann! (- Was ich mir ja in Thema "Delphi-Library.de » Algorithmen, Optimierung und Assembler » (perfektes) Mischen nach Fisher-Yates (perfect shuffle)" abgeguckt habe.)

Meine Panels sind von der Größe her: 100 mal 100
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 22.03.09 18:56 
Naja, aber wofür brauchst du da das div 2? Der Wert von i div 2 ändert sich doch natürlich wie gesagt nur alle 2 Schleifendurchläufe...
ausblenden Delphi-Quelltext
1:
KartenArray[i].Left := 8 + (i * (KartenArray[i].Width + 8));					
ffgorcky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Di 24.03.09 13:42 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Naja, aber wofür brauchst du da das div 2?


Weil ich doch erst mal nur zwei Panels nebeneinander setzen möchte und alle anderen untereinander...
...weil ich im Moment nur 6 Memory-Karten habe.

Später soll das natürlich gerne immer möglichst quadratisch (also gleich viele Karten in Tiefe und Breite) sein - also muss ich dann von der Wurzel den nächstkleineren, ganz-zahligen Wert als Teiler nehmen.
(- Oder?)


Zuletzt bearbeitet von ffgorcky am Di 24.03.09 19:05, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 24.03.09 21:34 
Welche Werte nimmt denn i an?
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
0 div 2 = 0
1 div 2 = 0
2 div 2 = 1
3 div 2 = 1
4 div 2 = 2
5 div 2 = 2
...
Damit ergeben sich bei 118*(i div 2) für Top folgende Positionen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
118 * (0 div 2) = 0
118 * (1 div 2) = 0
118 * (2 div 2) = 118
118 * (3 div 2) = 118
118 * (4 div 2) = 236
118 * (5 div 2) = 236
...
Meinst du vielleicht stattdessen die Breite oder Höhe geteilt durch die Anzahl der Karten? Das ist doch aber nicht i.
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Mi 25.03.09 10:39 
ich glaube das ist richtig, aber nur bei der Höhe, denn so erreicht er, dass für zwei aufeinanderfolgen Karten des Arrays den selben Faktor haben, denn Karte (1 und 2), dann (3 und 4) usw, sollen den selben Höhenfaktor haben, da sie nebeneinander liegen sollen (und somit die gleiche Top-Position haben).

aber beim den Left-positionen, das ist nicht nur etwas chaotisch, da ist dein Fehler (soweit ich sehe). Auch da soltlest du einen Faktor einbauen (bzw, an dieser STelle st div falsch). 100x100 Panels, mit nem Abstand von 18 pixeln? Dann würde ich sagen:

ausblenden Delphi-Quelltext
1:
2:
Top:=118*(i div 2);
Left:=118*(i mod 2);


das Modulo (mod) errechnet den Rest bei der Division:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
0 mod 2 = 0
1 mod 2 = 1
2 mod 2 = 0
3 mod 2 = 1
...


ich glaube, das brauchst du ;)

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin