Hi,
Ich hab folgendes Problem:
Es gibt zwei Arrays,zweidimensional, nennen wir sie einmal "DatenArray" und "DisplayArray".
Ich möchte nun Inhalte des datenarrays im Displayarray abbilden.
Wären nun beide Arrays gleich gross, wäre die Sache einfach:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var x,y : integer; begin for y := 0 to MaxY-1 do for x := 0 to MaxX-1 do DisplayArray[x,y] := DatenArray[x,y]; end; |
Aber leider kann das DatenArray sowohl kleiner oder grösser als das DisplayArray sein.
In dem Fall das das DatenArray kleiner als das DisplayArray ist sollen die Daten wiederholt angezeigt werden.
Ungefähr so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var x,y : integer; begin for y := 0 to MaxY-1 do for x := 0 to MaxX-1 do DisplayArray[x,y] := DatenArray[x mod MaxX,y mod MaxY]; end; |
Wenn das DatenArray grösser als das DisplayArray ist soll gescrollt werden können.
Dazu brauch ich einen Offset der anstelle eine Zuweisung
DisplayArray[x,y] := DatenArray[x,y]; das ganze entsprechend verschiebt. Auch hier sollen, falls man mit dem DisplayArray über die Grenze des DatenArrays hinausgescrollt die Daten wiederholt werden.
Zusammengefasst:
Man soll also "endlos" in alle Richtungen scrollen können, ohne jemals an einen Rand zu stossen. Die Daten wiederholen sich dann eben nur ab einem bestimmten Punkt. Ist das DatenArray kleiner als das DisplayArray sieht man sich wiederholende Daten auch ohne Scrollen.
Das Scrollen soll folgendermassen geschehen:
Nicht per Buttons oder Scrollbars, sondern dadurch das eine bestimmte Zelle zum "Mittlepunkt" wird.
Da die Grösse das DisplayArrays bekannt ist, lässt sich auch ausrechnen welche Zelle ungefähr in der Mittes ist und deren relative Position zur ausgewählten Zelle, etwa:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var CenterCell : TPoint; SelectedCell : TPoint; DeltaPos : TPoint; begin CenterCell.X := MaxX div2; CenterCell.Y := MaxY div2; DeltaPos.X := SelectedCell.X - CenterCell.X; DeltaPos.Y := SelectedCell.Y - CenterCell.Y; end; |
ist also der Mittelpunkt des DisplayArray bei (5,7) und wird die Zelle (6,12) in DisplayArray ausgewählt, so soll nun soweit gescrollt werden (in diesem Fall also "eins nach rechts und fünf nach unten"). Damit ist die ausgewählte Zelle im Mittelpunkt. (Den Wert für SelectedCell muss man natürlich danach noch updaten).
Hmpf
Trotz all dieser Vorüberlegungen bekomme ich das einfachg nicht hin.
Wie geht die Umwandlung von Display Koordinaten in Datenkoordinaten.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var x,y : integer; Pos : TPoint begin for y := 0 to MaxY-1 do for x := 0 to MaxX-1 do begin Pos := DisplayPosToDataPos(x,y); DisplayArray[x,y] := DatenArray[Pos.X,Pos.Y]; end; end;
function DisplayPosToDataPos(ACol,ARow:integer):TPoint; begin Result := ??? end; |
Ich bekomme es einfach nicht hin. Entweder gibts AccessViolations weil ich über die Arraygrenzen hinausschiesse, oder es wird nur Müll angezeigt.
Irgendwie habe ich da ein Brett vor dem Kopf bei dieser Indirektion.
Kann mir mal jemand auf die Sprünge helfen. Das wäre Super
Besten Dank.
Cheers,
Catweasel
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.