![]() |
Weiterlernen
Also,ich hatte bis zum letzten jahr in meiner Technischen Schule (Mechatronik) 2 jahre lang "Rechner und Programmieren".
Wir lernten im ersten jahr Pascal und dann Delphi,ab der dritten haben wir das Programmieren nur bei den CNC Maschinen und deshalb frage ich mich wie ich jetzt selbständig Delphi weiter lerne. Wir hatten bis zum ende probleme mit der funktion array gelöst.(Sortierung von 5 nummern von der größten bis zur kleinsten zahl,usw.) Also wenn mir jemand helfen kann würde mich das freuen. (Ich hab schon gesehen dass es einen sub-forum für tutorials gibt,leider glaub ich das ich für die meisten dinge dort noch nicht das wissen habe) |
AW: Weiterlernen
|
AW: Weiterlernen
Am besten ist immer sich selbst eine Aufgabe zu stellen..
Und dann nach Lösungen zu suchen. Durch viel lesen und eine menge an versuchen sollte das kein Problem sein. gruss |
AW: Weiterlernen
So habe ich ebenfalls zu programmieren gelernt.
Nachdem ich die Grundlagen in der Schule erlernt hatte, wollte ich selbst etwas programmieren und habe einfach angefangen. Als ich dann auf etwas stieß, das ich nicht konnte, habe ich im Internet danach gesucht (Google führte mich damals fast immer zum Delphi-Treff oder hierher) und wurde fündig. Je häufiger das passierte, desto weniger musste ich suchen. Und heute kann ich programmieren. :-D |
AW: Weiterlernen
Jup, das beste ist es etwas zu machen was einen interessiert bzw. ein Problem löst was man selbst hat. Ansonsten gibt es hier im Forum einige Threads mit Ideen für kleinere Programmierprojekte.
|
AW: Weiterlernen
Erstmal Willkommen in der Delphi-PRAXIS :thumb:
Wow, toll zu sehen das ich nicht der einzige bin der so Krank (:twisted:) im Kopf war um von sich aus gefallen an sowas zu finden und sich selbst an zu eignen. (War damals 10 und als ich mich hier angemeldet habe 11/12 Jahre alt lol) Ich denke auch das man mit einfachem "Learning by doing" am schnellsten und für sich am besten voran kommt. Bücher sind heutzutage zu schnell veraltet und vieles findet man in der ![]() ![]() Natürlich kannst du auch immer hier nachfragen falls du nirgends Informationen dazu findest. Freundliche Grüsse |
AW: Weiterlernen
Zitat:
PS:Vielen Dank auch für die anderen antoworten. |
AW: Weiterlernen
1. Schön, das du etwas Spass am Programmieren gefunden hast
2. Schön, das du mit Pascal in Form von Delphi zurecht kommst :) 3. Schön, das du auch "alleine" weitermachen/weiter kommen willst Meiner Erfahrung.. das Allerwichtigste: erhalte dir den Spaß !!! Schnelle kleine Programme die dir selbst und anderen was zeigen können, sind anfangs wichtiger wie schönes internes Programmdesign was aber nur ein paar Textausgaben macht. Wenn du irgendwann selbst erkennst, das du deinen Code strukturieren musst, weil du nach ein paar Monaten in deinem Quelltext nicht mehr durchblickst, dann ist das eine wichtige Erkenntnis, und dann macht auch das "säubern" / neu und "schön" schreiben des Programms Spass. Wenn du Delphi im Kopf hast, solltest du in dein Hobby etwas Geld investieren. Hole dir ein aktuelles RadStudio Berlin 10.1pro als Schulversion für 165Eur. (das Geld ist nur zum Lernen investiert, denn offiziell darfst du kein eigenes Programm was du damit erstellt hast an andere weitergeben... auch wenn es weh tut, es ist als SSL trotzdem sehr PREISWERT!!!) ![]() Wenn du später weißt was du machst und was du willst, kannst du immernoch die Opensource Sachen ala Lazerus,Freepascal,CodeTyphon dir anschauen und für Programme zur Weitergabe nutzen, bzw. einen Chef finden der dir eine Vollversion von Delphi kauft:) (wenn du kein Geld für ne IDE ausgeben WILLST oder aus Prinzip nur mit Opensource und kostenloser Software arbeiten möchtest, dann wirst du mit Delphi/RadStudio nicht glücklich |
AW: Weiterlernen
Abend alle,wollte jetzt kein thread für mein problem aufmachen,das lernen geht schon ein wenig voran aber leider weiss nicht genau warum mein "loop" (hoff dass der begriff gut gewählt ist) nicht funktioniert.
Delphi-Quellcode:
Wollte ein wenig mit den Shapes rumspielen... :?
procedure TForm1.Timer1Timer(Sender: TObject);
begin if shape1.Left>=0 then begin timer1.Interval:=100; shape1.Left:=shape1.Left+30; if shape1.Left=150 then timer1.Enabled:=false; if timer2.Enabled=false then timer1.Enabled:=true; //geht nicht .____. end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if timer1.Enabled=false then begin timer2.Interval:=100; shape1.left:=shape1.Left-30; if shape1.Left=0 then timer2.Enabled:=false; end; end; end. |
AW: Weiterlernen
- Verwende für Quelltexte im Forum möglichst immer die Delphi-Tags (Helm-Symbol)
- Rücke den Code möglichst sinnvoll ein, dies bringt nicht nur Dir eine bessere Übersicht. - Direkte Überprüfung auf True oder False ist schlecht, besser Du verwendest folgende Form
Delphi-Quellcode:
if Timer1.Enabled then....
if NOT Timer1.Enabled then... Zitat:
Insofern macht die beanstandete Zeile keinen Sinn - der Timer1 läuft ja bereits. Ich nehme mal an, dass Du eigentlich den Timer2 starten willst? |
AW: Weiterlernen
Das problem ist das,das programm sich nicht "wiederholt" nachdem timer1 und timer2 einmal ausgeführt wurden stopt das programm...
Delphi-Quellcode:
<---Mein versuch den loop zu wiederholen wen er einmal ausgeführt wurde.
if timer2.enabled = false then timer1.enabled:=true; //geht nicht .____.
|
AW: Weiterlernen
Zitat:
Code:
Untersuchen wir mal Timer1.
Stopp-Bedingungen
Timer 1: shape1.left = 150 Timer 2: shape1.left = 0 Annahme Shape.Left ist zu Beginn "0". Somit müsste der Timer1 genau 5x ausgeführt werden und danach stoppen. In diesem Zusammenhang wäre es besser für die Abbruchbedingung ">= 150" einzusetzen. Aber wie wird der Timer1 wieder gestartet? (gilt auch für Timer2) Timer2: Die Zeile
Delphi-Quellcode:
macht irgendwie keinen Sinn... ebenso
if timer1.enabled
then begin
Delphi-Quellcode:
timer2.interval := 100;
Delphi-Quellcode:
procedure tform1.timer1timer(sender: Tobject);
begin if shape1.left >= 0 then begin timer1.interval := 100; shape1.left := shape1.left + 30; if shape1.left = 150 then begin timer1.enabled := false; timer2.enabled := true; end; end; end; procedure tform1.timer2timer(sender: Tobject); begin if timer1.enabled then begin timer2.interval := 100; shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; end; end. |
AW: Weiterlernen
Nimm einfach einen Timer, lass den einfach immer durchlaufen und ändere die Schrittweite ab.
Delphi-Quellcode:
TForm1 = class( TForm )
... private FShapeIncrement: Integer; public procedure AfterConstruction; override; end; procedure TForm1.AfterConstruction; begin inherited; // Startwert festlegen FShapeIncrement := 30; end; procedure TForm1.Timer1OnTimer( Sender: TObject ); var newLeft: Integer; maxLeft: Integer; begin newLeft := Shape1.Left + FShapeIncrement; maxLeft := Shape1.Parent.ClientWidth - Shape1.Width; if newLeft <= 0 then begin newLeft := 0; FShapeIncrement := - FShapeIncrement; end else if newLeft >= maxLeft then begin newLeft := maxLeft; FShapeIncrement := - FShapeIncrement; end; Shape1.Left := newLeft; end; |
AW: Weiterlernen
Folgender Code funktioniert: (Bedingung Shape1.Left ist zu Beginn = 0)
Delphi-Quellcode:
Aber ich gebe Sir Rufo Recht, ein Timer ist besser :-)
procedure TForm1.Timer1Timer(Sender: TObject);
begin if shape1.left < 150 then shape1.left := shape1.left + 30; if shape1.left >= 150 then begin timer2.enabled := true; timer1.enabled := false; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if shape1.left > 0 then shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; |
AW: Weiterlernen
Vielen dank,euch beiden ^_^ !
|
AW: Weiterlernen
Ist mir jetzt ein wenig peinlich wieder nach hilfe zu suchen,leider hab ich schon ein paar tage versucht das programm hinzubekommen,ohne erfolg... :oops:
Delphi-Quellcode:
Die idee ist es erstmal den Shape 2 auf gleiche höhe wie Shape1 zu setzen,wenn das erst mal möglich ist wollte ich eine collision detection einzubauen.Nur funktioniert die KeyDown procedure nicht.Hoffe dass solch eine frage nicht doppelt gestellt wurde,aber die anderen themen haben mir leider nicht geholfen...
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); IF timer1.enabled:=true then begin IF key = VK_Down THEN shape1.Top := shape1.Top +5; IF key = VK_UP THEN shape1.Top := shape1.Top -5; IF key = VK_RIGHT THEN shape1.Left := shape1.Left +5; IF key = VK_LEFT THEN shape1.Left := shape1.Left -5; end; end; procedure TForm1.FormCreate(Sender: TObject); begin KeyPreview:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if shape1.left < 150 then shape1.left := shape1.left + 30; if shape1.left >= 150 then begin timer2.enabled := true; timer1.enabled := false; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if shape1.left > 0 then shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; end. |
AW: Weiterlernen
Hi,
Was funktioniert da genau nicht? Falls die prozedur gar nicht aufgerufen wird, versuche mal die KeyPreview Eigenschaft von deinem Formular auf True zu setzen. Edit: Ok, beim 2. Blick ist es nicht zu übersehen. :cyclops: Du solltest dir unbedingt angewöhnen deinen Code richtig einzurücken, denn so kann (bzw. will :stupid:) das doch keiner lesen. :D Das hilft dir wirklich weiter wenn du später lange und komplexe Algorithmen schreibst, denn du siehst "automatisch" wo du gerade im Code bist und kannst ganz klare Abschnitte/Trennungen schaffen. Ausserdem hättest du so das Problem dann ganz einfach selbst bemerkt ;) Und zwar fehlt da sehr wahrscheinlich das begin der Prozedur. So sollte der Code kompilierbar sein: (nicht getestet - aber lesbar formatiert ist er! :D) Nachtrag: Du hast noch einen Fehler drin und zwar bei dir auf der 3. Zeile (
Delphi-Quellcode:
) versuchst du eine Abfrage mit dem "Zuweisungszeichen" (:=) zu machen. Bei abfragen fragst du aber nur mit dem Gleich-Zeichen (=) ab. Im unteren Code ist es korrigiert.
IF timer1.enabled:=true then
Delphi-Quellcode:
Auch wäre es sehr empfehlenswert uns den Fehler mitzuteilen der dir der Compiler ausspuckt - auch ein sehr guter Hinweis was der Fehler sein könnte. :)
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin IF timer1.enabled=true then // Du könntest auch ganz einfach "if timer1.enabled then" abfragen für TRUE. begin IF key = VK_Down THEN shape1.Top := shape1.Top +5; IF key = VK_UP THEN shape1.Top := shape1.Top -5; IF key = VK_RIGHT THEN shape1.Left := shape1.Left +5; IF key = VK_LEFT THEN shape1.Left := shape1.Left -5; end; end; procedure TForm1.FormCreate(Sender: TObject); begin KeyPreview:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if shape1.left < 150 then shape1.left := shape1.left + 30; if shape1.left >= 150 then begin timer2.enabled := true; timer1.enabled := false; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if shape1.left > 0 then shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; Find ich sehr gut das du aus eigenem Antrieb weiter lernst. Weiter so! :thumb: Freundliche Grüsse |
AW: Weiterlernen
Zitat:
Ich bekomme keine fehlermeldung aber der Shape 2 bewegt sich leider nicht wenn ich meine pfeiltasten benutze. PS:Ich wollte gar nicht eine IF schleife haben,wo kommt denn hier,bin halt ein profi programmierer:lol: |
AW: Weiterlernen
Zitat:
Wenn du dein Shape mit den Pfeiltasten bewegen willst brauchst du doch nicht die 2 Timer die da dazwischen funken und dein Shape selbst auch bewegen oder? Zitat:
Ich würde erstmal nachsehen ob OnKeyDown überhaupt getriggert wird indem du dort einen Haltepunkt setzt und mit F9 den Debugger startest, dann kannst du auch sehen ob sich da überhaupt was tut. Zitat:
Versuchs mal so:
Delphi-Quellcode:
Hier ist die if-abfrage die du ja nicht willst draussen und es wird auch shape2 (Falls es denn auch wirklich shape2 heisst!) bewegt.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin IF key = VK_Down THEN shape2.Top := shape2.Top +5; IF key = VK_UP THEN shape2.Top := shape2.Top -5; IF key = VK_RIGHT THEN shape2.Left := shape2.Left +5; IF key = VK_LEFT THEN shape2.Left := shape2.Left -5; end; Freundliche Grüsse |
AW: Weiterlernen
Zitat:
Denn code kann ich kompallieren weil ich den ersten teil des codes nicht beutzt habe. Jetzt das ich wieder da bin will fleissig weiterlernen,und ich wollte wissen was ich alles brauche um ein einfaches 2D-Jump'n'Run zu machen,ich glaub es sollte als mein erstes projekt mehr realistisch sein alls ein MMORPG. :-D |
AW: Weiterlernen
Wollte einen einfachen Countdown programmieren,den Code kann man kompilieren,es kommt keine Fehler meldung.
Will wirklich keine zeit von euch verschwenden. :?
Delphi-Quellcode:
var
Form1: TForm1; TotalTime:TTime; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin totaltime:=1000; timer1.Interval:=1000; label1.Caption:=Timetostr(totaltime-1); end; end. |
AW: Weiterlernen
Zitat:
|
AW: Weiterlernen
Zitat:
Zitat:
timer1.Interval:=1000;Wie oft sich die procedure wiederholt (Glaub das wird das einzige richtig sein :lol: ) aber immer nur label1.Caption:=Timetostr(totaltime-1); Hier sollte sich der CountDown anzeigen,da der wert in der labele sich wohl nicht verändert und auf 999 bleiben sollte.Zeigt aber immer nur 00:00:00 an,sollte es wohl anders machen?Zbs. x:=totaltime-1; |
AW: Weiterlernen
TDateTime, TTime und TDate sind allesamt intern Double-Werte, bei denen der ganzzahlige Anteil zur Verschlüsselung des Datums und der Nachkomma-Anteil zur Verschlüsselung der Zeit verwendet wird. Deswegen erhältst du immer die Zeit 00:00:00 - 1000 und 999 sind eben ganze Zahlen. Zur Arbeit mit Zeit-/Datums-Werten solltest du die Unit DateUtils verwenden:
Delphi-Quellcode:
Ich gehe einfach mal davon aus, dass du hier mit 1000 Sekunden arbeiten willst - sonst eben Millisekunden, Minuten oder Stunden verwenden.
//totaltime initialisieren
totaltime := IncSecond(0, 1000); //1 Sekunde abziehen totaltime := IncSecond(totaltime, -1); Die Initialisierung von totaltime sollte natürlich außerhalb des OnTimer-Events geschehen. Die Eigenschaft Interval eines TTimer gibt an, alle wieviel Millisekunden das OnTimer-Event ausgelöst wird, bei 1000 also jede Sekunde. |
AW: Weiterlernen
Stell dir vor, DU bist der Computer. Also tu einfach das, was der Computer auch tun würde.
Es wird der Timer ausgelöst und Timer1Timer aufgerufen. Du stellt TotalTime auf 1000. Du setzt das Timerintervall auf 1000. Du zeigst TotalTime-1 an, also 999. Fertig. Nach einer Sekunde wird der Timer ausgelöst und Timer1Timer aufgerufen. Du stellt TotalTime auf 1000. Du setzt das Timerintervall auf 1000. Du zeigst TotalTime-1 an, also 999. Fertig. Nach einer Sekunde wird der Timer ausgelöst und Timer1Timer aufgerufen. Du stellt TotalTime auf 1000.... Kapiert ? :-D |
AW: Weiterlernen
Zitat:
Delphi-Quellcode:
Fühl mich jetzt etwas doof...
var
Form1: TForm1; TotalTime:TTime; incsecond:TDateTime; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin totaltime := IncSecond (0, 1000); //Fehler meldung "missing operator or semicolon" timer1.Interval:=1000; label1.Caption:=Timetostr(totaltime); end; end. |
AW: Weiterlernen
Wenn ich das richtig sehe, möchtest Du jede Sekunde die Totalzeit um eine Sekunde erhöhen verringern.
Wie wäre es denn dann einfach mit
Delphi-Quellcode:
In einem Datetimewert steht 1 für einen Tag. Ein Tag hat 24 * 60 * 60 = 86400 Sekunden. Eine Sekunde ist also 1 / 86400 und diesen Wert musst Du dann pro Sekunde zu von Deinem Zeitzähler addieren subtrahieren.
totaltime := totaltime - (1 / 86400);
Delphi-Quellcode:
sollte die gleiche Wirkung haben.
totaltime := IncSecond(toteltime,-1);
Das Timerintervall muss nicht bei jedem Aufruf der des Timerereignisses neu gesetzt werden. Das
Delphi-Quellcode:
kann entfallen.
timer1.Interval := 1000;
|
AW: Weiterlernen
IncSecond ist eine Funktion aus der Unit DateUtils, mir ist nicht ganz klar, wieso du das als Variable deklarierst.
Dadurch dass du es als Variable deklarierst, wird an der Stelle natürlich versucht, auch darauf zurückzugreifen, was nicht wirklich funktionieren kann. Das Initialisieren von totaltime sollte noch immer nicht in der onTimer-Methode geschehen, sondern z.b. im OnCreate des Formulars. |
AW: Weiterlernen
Es liegen grundsätzlich mehrere Fehler vor.
Zum einen solltest Du Dir den Post #25 zu Herzen nehmen und versuchen, den Ablauf wie dort beschrieben, nachzuvollziehen. Du wirst feststellen, dass die folgenden Zeilen im Timer-Event nichts zu suchen haben - wieso, wirst Du sicher noch herausfinden.
Delphi-Quellcode:
Der "zweite" Fehler liegt darin, dass Du eine Variable Namens IncSecond definierst.
...
timer1.Interval:=1000; ... Eigentlich möchtest Du ja die gleichnamige Funktion aufrufen - also die Zeile ersatzlos streichen.
Delphi-Quellcode:
var
incsecond:TDateTime; |
AW: Weiterlernen
Zitat:
Sollte ich sagen das ich Delphi 7 benutzte? |
AW: Weiterlernen
Auch unter Delphi 7 solltest du DateUtils in den uses einbinden können:
Delphi-Quellcode:
implementation
uses DateUtils; |
AW: Weiterlernen
Zitat:
Ehm,ok jetzt klappt fast alles nur dass sich der timer nicht wiederholt.Die labele zeigt nur 00:00:59 an,und nach einer sekunde bleibt es auf 00:00:59.
Delphi-Quellcode:
var
Form1: TForm1; TotalTime,x:TTime; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin totaltime := IncSecond (0, 60); totaltime := IncSecond (totaltime,-1); //Versucht durch "x" variable zu ersetzen,gleiches resultat. label1.Caption:=Timetostr(totaltime ); end; end. |
AW: Weiterlernen
Noch einmal - das Initialisieren der totaltime Variable gehört nicht in das OnTimer-Event. Du setzt bei jedem Durchlauf totaltime erst auf 60, dann auf 59 Sekunden.
Diese Intialisierung solltest du z.B. im OnCreate des Formulars durchführen. |
AW: Weiterlernen
Zitat:
|
AW: Weiterlernen
Ich weiß leider nicht genau, welche Delphi-Version du einsetzt.
Als erstes solltest du das neue Formular gleich mal wieder löschen - und auf das alte Wechseln. In der Designansicht kannst du jede vorhandene Komponente anwählen, auch das grundlegende Formular. Im Objektinspektor sollte es dann zwei Reiter "Eigenschaften" und "Ereignisse" - dort in den Reiter Ereignisse wechseln. Da solltest du dann ein OnCreate finden und dann einfach in das leere Edit rechts daneben doppelklicken, dann sollte im Code der Rumpf für das FormCreate erscheinen. |
AW: Weiterlernen
Zitat:
Delphi-Quellcode:
Ah,man braucht also nicht zwei Formen. :lol:
var
Form1: TForm1; TotalTime,x:TTime; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin totaltime := IncSecond (0,60); totaltime := IncSecond (totaltime,-1); end; procedure TForm1.FormCreate(Sender: TObject); begin label1.Caption:=Timetostr(totaltime ); end; end. Will jetzt nicht dass ganze forum voll spamen,aber die label zeigt einfach 00:00:00 an. PS:Ich benuzte Delphi 7. |
AW: Weiterlernen
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin //bei jedem Aufruf des Timer-Ereignisses totaltime := IncSecond(totaltime, -1); //1 Sekunde abziehen label1.Caption:=Timetostr(totaltime); //Label aktualisieren end; procedure TForm1.FormCreate(Sender: TObject); begin totaltime := IncSecond (0,60); //hier deine Variable initialisieren! end; end. |
AW: Weiterlernen
Zitat:
PS:Muss ich das so machen weil sich die variable sonst bei jedem timer tick "resetet" ? |
AW: Weiterlernen
Die resettet sich nicht von alleine - du machst das.
Delphi-Quellcode:
setzt totaltime auf den Wert 60 Sekunden.
totaltime := IncSecond (0,60);
|
AW: Weiterlernen
Zitat:
Und war es möglich,eine procedure zu erstellen die "OnCreate" ersetzt,weiss eigentlich nicht so viel über proceduren. :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz