Ich würde dann gerne weiter bei der Kreis App bleiben und fortfahren.
Grüße
Ich hatte Dir ja zugesagt, Dir die Beispieldatei zur Verfügung zu stellen, wenn gewünscht, das mache ich hier auch in der Anlage.
Ich habe mir die Statements hier im Thread durchgelesen und bin ein wenig unsicher, ob und wie ich Dir helfen kann, da ich nicht weiß, was ich an Vorkenntnissen voraussetzen kann (wie weit hast Du Dich schon mit Programmierung befasst, sind Dir die Unterschiede zwischen Prozedur und Funktion bekannt, weißt Du schon, was Variablen sind, Objekte, usw).
Wenn das alles "böhmische Dörfer" für Dich sind, dann würde ich auch empfehlen, erst mal ein grundlegendes Buch über Programmierung zu lesen, am besten welches sich dann mit Beispielen an Pascal orientiert, falls Delphi weiterhin Deine gewünschte Entwicklungsumgebung sein sollte.
Falls Dir diese Begriffe aber schon etwas sagen sollten, umso besser.
Hier mal der Source-Code, des Programms. Anliegend auch ein Screenshot, aus dem Du die Zuordnungen der ObjektNamen zu den tatsächlichen Objekten in der Form erkennen kannst. Zusätzlich noch ein paar Erläuterungen, was da abläuft.
Delphi-Quellcode:
procedure TFormCircles.FormCreate(Sender: TObject);
const
Gap = 50;
var
C, X: Integer; LA : TLayout; T: TText;
aw: extended; NewCircle, PrevCircle: TCircle;
procedure CreateCircleNumbers (StartNr: Integer; Circle: TCircle);
var
L: integer;
begin
for L := StartNr to 23 do begin
// Eine Kopie des Layouts incl. Kindobjekte erstellen
LA := TLayOut (circleTemplate.FindStyleResource('number', true));
if LA <> NIL then begin
LA.Parent := circle;
LA.height := Circle.Height;
LA.RotationAngle := L * 15;
// Nur ein Child vorhanden, ist die TText-Komponente
T := TText (LA.Children[0]);
if T <> NIL then begin
inc (c);
T.Text := (c).ToString;
end;
end;
end;
end;
begin
c := 1; aw := CircleTemplate.width;
// create first inner circle
CreateCircleNumbers (1, CircleTemplate);
PrevCircle := CircleTemplate;
// create next outer circles
for X := 1 to 9 do begin
NewCircle := TCircle (Layout1.FindStyleResource('circletemplate', true));
NewCircle.parent := LayOut1;
NewCircle.SendToBack;
aw := aw + Gap;
NewCircle.Width := aw;
NewCircle.Height := aw;
CreateCircleNumbers (0, NewCircle);
PrevCircle := NewCircle;
end;
//Layout1.RotationAngle := -90;
end;
Wie es funktioniert: Auf der Form habe ich zunächst folgende Objekte eingefügt:
1. "Layout1", es dient einfach nur als - auf der Form zentrierter - Behälter für weitere Objekte.
2. "CircleInner (ein TCircle-Object), der einfach nur den innersten Kreis (den Rand) darstellen soll.
3. "CircleTemplate" (auch TCircle), der als Vorlage (für weitere Kopien von Kreisen) dient, um dann am Rand die Zahlen darzustellen
4. "LayoutZiffer" (noch ein TLayout), welches als Behälter dient für
5. "Text1" (ein TText-Object) und die gewünschten Zahlen wiedergibt.
Das LayoutZiffer-Objekt kann man per "Rotationangle" um die gewünschte Gradanzahl drehen.
Der oben dargestellte Source-Code macht nun folgendes:
1. Er erzeugt mit Aufruf der Procedure "CreateCircleNumbers" die Zahlen für den ersten Kreis
2. Mit der Schleife "for x := 1 to 9 do begin" werden 9 mal Kopien von diesem ersten Kreis erzeugt. Dabei wird er immer etwas vergrößert (mit dem durch "GAP" festgelegten konstanten Wert) und die Zahlen natürlich fortlaufend erhöht.
Eigentlich eine ganz einfache Geschichte. Man könnte das Programm nun erweitern, indem man z.B. die Erzeugung des Kreises nicht direkt mit Erzeugung der Form selber macht, sondern in eine eigene Prozedur auslagert. Am oberen Rand der Form könnte man ein weiteres TLayout (oder besser ein TPanel) einfügen, in dem Du ein TEdit einfügst und ein TButton. Wenn Du dann im TEdit-Feld eine maximale Anzahl der Nummer eingegeben hast, klickst Du auf den Schalter, rufst die Prozedur auf und der Kreis wird erzeugt.
Du müsstest die Prozedur natürlich auch noch abändern, etwa so, dass Du statt der For-Schleife eine While-Schleife benutzt und als Abbruchbedingungen für die Erzeugung von weiteren Zahlen das erreichen der gewünschten Zahl nimmst. Wenn der Aufruf zur Laufzeit mehrfach möglich sein soll, müsstet Du ganz am Anfang eine Kopie von Layout1 erzeugen und mit dieser Kopie den Nummernkreis erzeugen. Beim nächsten mal löscht Du dann die erzeugte Kopie, erstellst wieder eine neue Kopie und erzeugst einen anderen Nummernkreis, usw.
Ich habe es extra mal ein wenig ausführlicher beschrieben, so dass es für Dich ein Test für Dein Verständnis von Programmierung sein kann. Wenn Du hier gar nichts verstehst, würde ich den Empfehlungen einiger anderer folgen und vorschlagen, dass Du Dich erst mal mit den Grundlagen der Programmierung beschäftigst.
Wenn Du es (oder das meiste) verstanden haben solltest, könntest Du weiter mit Delphi arbeiten und Dir Schritt für Schritt weitere Kenntnisse zulegen.
Ich würde Dir aber empfehlen, NICHT mit der
VCL anzufangen, sondern direkt mit FMX. Ich habe hier mal ein paar wenige Argumente aufgeführt, warum das generell mehr Sinn macht:
http://www.devpage.de/blog/firemonkey.htm (siehe dort Bitte Punkt "12 FireMonkey vs.
VCL "). Da Du ja auch auf Android willst, ist FMX dann unter Delphi sowieso alternativlos, weil es eben mit
VCL nicht geht.
Wenn Du der englischen Sprache mächtig bist, kann ich Dir ein Buch von Pawel Glowacki ans Herz legen, es führt in die Programmierung mit Delphi und FMX und auch für die mobilen Plattformen ein:
https://www.amazon.de/Expert-Delphi-...gloacki+expert (leider gibt es nichts vergleichbares auf Deutsch).
Wenn Du es Dir holst, solltest Du Dir dort - neben der Einleitung - unbedingt das Kapitel "The Power of Parenting" durchlesen, da es das so nützliche Container-Konzept von FireMonkey erläutert. Das Buch zeigt Dir auch, wie Du Dein Delphi für die Benutzung mit Android einrichtest.