Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Befehl zum pausieren (https://www.delphipraxis.net/154940-befehl-zum-pausieren.html)

Mesion 1. Okt 2010 19:07

Delphi-Version: 7

Befehl zum pausieren
 
Guten Tag,
ich hoffe, dass ich hier in das richtige Unterforum schreibe, wenn nicht, dann tut es mir Leid.

Seit ein paar Wochen habe ich nun Informatik in der Schule und als Hausaufgabe sollen wir ein Paintprogramm mit 8 Funktionen programmieren.
Für besondere Funktionen gibt es Pluspunkte.

Ich habe mir nun überlegt eine Funktion zu machen bei der ein ausgefüllter Kreis gezeichnet wird, der immer größer wird, je länger die Maus gedrückt wurde.
Das untere ist dabei herrausgekommen und es funktioniert auch, aber der Kreis vergrößert sich zu schnell, deswegen suche ich nach einem Befehl den ich in die If-Verzweigung bauen kann, der sozusagen die Zeit kurz stehen lässt, sodass die Schleife zum Beispiel 0,1 Sekunden eine Pause einlegt.

Es wäre sehr nett, wenn mir vielleicht jemand helfen könnte.

Mit freundlichen Grüßen
Mesion

Delphi-Quellcode:
                  repeat

                  If dieMaus.istGedrueckt = false then
                  begin
                  hposition2:=0;
                  meinStift.bewegeBis(dieMaus.hPosition,dieMaus.vPosition);
                  end;

                  If dieMaus.istGedrueckt = true then
                  begin
                  meinStift.bewegeBis(meinStift.hPosition,meinStift.vPosition);
                  hposition2:=(hposition2+1);
                  meinStift.zeichneKreis(1+hposition2);
                  end;

                  until
                  dieMaus.doppelklick;
[EDIT]Delphi-Tags eingefügt. Bitte künftig selber machen. Danke. MfG. Christian Seehase[/EDIT]

Klaus01 1. Okt 2010 20:59

AW: Befehl zum pausieren
 
Delphi-Quellcode:
repeat
  If not dieMaus.istGedrueckt {= false} then
    begin
      hposition2:=0;
      meinStift.bewegeBis(dieMaus.hPosition,dieMaus.vPosition);
    end{;}
  else
  {If dieMaus.istGedrueckt then}
    begin
      meinStift.bewegeBis(meinStift.hPosition,meinStift.vPosition);
      hposition2:=(hposition2+1);
      meinStift.zeichneKreis(1+hposition2);
    end;
         
  sleep(150); // oder besser delay aus der Codelib nehmen
until dieMaus.doppelklick;
Grüße
Klaus

Mesion 1. Okt 2010 21:27

AW: Befehl zum pausieren
 
Vielen Dank für deine Antwort.

Wenn ich das mit sleep mache, dann steht da Undefinierter Bezeichner, muss ich den Befehl eventuell auf Deutsch benutzen?
Schlafen, Ruhen und Pausieren habe ich aber schon ausprobiert ^^

Satty67 1. Okt 2010 21:38

AW: Befehl zum pausieren
 
Nein, die Funktion wird so geschrieben.

Du hast deine Zeichenfunktionen wahrscheinlich in einer extra Unit. Da wird nicht der Standard-Satz externer Units eingetragen.

In der Unit, in welcher Du sleep() verwenden willst, in die uses Liste Windows mit aufnehmen (uses im Quelltext suchen).

Tipp:
Cursor über geschriebenes sleep(), dann F1. In dem Hilfetext steht auch immer die externe Unit, in der die Funktion/Procedure etc. definiert ist. Natürlich nur wenn es ein bekannter Bezeichner ist.

Luckie 1. Okt 2010 21:38

AW: Befehl zum pausieren
 
Sollte eigentlich in der Windows.pas deklariert sein. Hast du die Unit unter uses eingebunden?

Aber sag mal, mit was für einer VCL programmiert ihr da in der Schule, da da ja irgendwie alles auf deutsch ist.

Satty67 1. Okt 2010 21:48

AW: Befehl zum pausieren
 
Sieht mir eher nach einer teilweise deutschsprachigen Komponenten/Objekt-Sammlung zum Zecihnen aus.

Mesion 2. Okt 2010 16:47

AW: Befehl zum pausieren
 
Guten Tag,
vielen Dank für die zahlreichen Antworten.
Wir arbeiten mit Stifte und Mäuse Version 2.4

Ihr habt Recht und der Befehl wurde umgenannt.
Er heisst "warte()".
Ich habe aber schon wieder ein Problem.
Ich soll ja 8 Funktionen schreiben und die meisten habe ich jetzt auch schon, aber sie lassen sich irgendwie nicht ineinanderfügen.
Alleine funktionieren sie aber einwandfrei.
Ich glaube das Problem hat mit der Tastatur zu tun.

In der Schule hatten wir schon 2 Funktionen in einem Programm: Malen und Radieren.
Ich habe nach dem gleichen Schema dann noch 3 Funktionen von mir eingefügt.
Kreise die immer größer werden, je länger man drückt.
Das gleiche nochmal mit Rechtecken und dann noch Linien zeichnen.


Es wäre echt nett wenn mir da jemand helfen könnte,
ich bin schon am verzweifeln.

Mit freundlichen Grüßen
Mesion



Delphi-Quellcode:
begin
  meinStift.hoch;
  repeat
    if (dieTastatur.wurdeGedrueckt) then
    begin
    dieTastatur.zeichen;
      if (dieTastatur.zeichen='r') then
      begin
        meinStift.radiere;
        meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
        if (dieMaus.istGedrueckt) then
        begin
          meinStift.runter;
        end
        else
        begin
          meinStift.hoch;
        end;
      end;
      if (dieTastatur.zeichen='z') then
      begin
        meinStift.normal;
        meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
        if (dieMaus.istGedrueckt) then
        begin
          meinStift.runter;
        end
        else
        begin
          meinStift.hoch;
        end;
      end;
      if (dieTastatur.zeichen='k') then
      begin
        if (dieMaus.istGedrueckt = true) then
        begin
          meinStift.setzeLinienBreite(2);
          meinStift.bewegeBis(meinStift.hPosition,meinStift.vPosition);
          RadiusKreis:=(RadiusKreis+1);
          warte(10);
          meinStift.zeichneKreis(Radiuskreis);
        end
        else
        begin
          meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
          meinStift.hoch;
          Radiuskreis:=0;
        end;
        if (dieTastatur.zeichen='e') then
        begin
          if (dieMaus.istGedrueckt = true) then
          begin
            meinStift.setzeLinienBreite(2);
            meinStift.bewegeBis(meinStift.hPosition,meinStift.vPosition);
            BreiteRechteck:=(BreiteRechteck+1);
            LaengeRechteck:=(LaengeRechteck+1);
            warte(10);
            meinStift.zeichneRechteck(BreiteRechteck,LaengeRechteck);
          end;
        end
        else
        begin
          meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
          meinStift.hoch;
          BreiteRechteck:=0;;
          LaengeRechteck:=0;
        end;
        if (dieTastatur.zeichen='l') then
        begin
          if (dieMaus.istGedrueckt = true) then
          begin
            meinStift.runter;
            meinStift.zeichneKreis(3);
            meinStift.bewegeBis(meinStift.hPosition,meinStift.vposition);
          end
          else
          begin
            meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
            meinStift.hoch;
          end;
        end;
      end;
      dieTastatur.weiter;
    end;
  until (dieMaus.doppelklick);
end;

Sir Rufo 2. Okt 2010 17:09

AW: Befehl zum pausieren
 
Es wird nur schwierig sein Hilfe zu so einer externen Bibliothek von uns zu bekommen.

Stell dir vor ich baue mir eine Bibliothek und für die Ausgabe eines Textes auf dem Bilschirm wird der Befehl
Code:
Popel
benutzt.

Wer soll dass wissen, dass für die Ausgabe folgender Code notwendig ist
Delphi-Quellcode:
Popel( 'du mich auch' );
Dazu muss man die Bibliothek kennen.

Mesion 2. Okt 2010 17:55

AW: Befehl zum pausieren
 
Ja das ist natürlich einleuchtend ^^

Es geht halt darum, dass das Programm immer das letzte Zeichen der Tastatur abfragt und dadurch soll dann immer eine bestimmte Schleife ausgeführt werden.

Bei dieTastatur.wurdeGedrueckt; wird abgefragt ob die Tastatur überhaupt ein Zeichen enthält.

Der Befehl zum abfragen welcher Buchstabe es ist, ist dieTastatur.zeichen;

Und um das vorderste Zeichen zu löschen bzw. die Tastatur zu ''resetten''gibt es den Befehl dieTastatur.weiter;

Mehr Befehle haben wir für die Tastatur nicht bekommen.

Mit freundlichen Grüßen
Mesion

xZise 2. Okt 2010 18:00

AW: Befehl zum pausieren
 
Möchtest du das man mehrere Tasten gleichzeitig drücken kann?

Außerdem, müsstest du doch, wenn man das k drückt, sagen, dass die Tastatur ein Zeichen weiter geht oder?
Delphi-Quellcode:
if (dieTastatur.zeichen='k') then
begin
  if (dieMaus.istGedrueckt = true) then
  begin

  end
  else
  begin

  end;

  if (dieTastatur.zeichen='e') then
  begin

  end
  else
  begin
    // HIEEEEERR
  end;

  if (dieTastatur.zeichen='l') then
  begin

  end;
end;
Er wird immer im HIEEEEERR Block landen oder?

Übrigens, könntest es auch so schreiben:
Delphi-Quellcode:
if (zeichen = 'a') then
begin

end
else if (zeichen = 'b') then
begin

end;
Weil beide Zeichen gleichzeitig werden wohl nicht gehen.

Und dann kriegt man das noch besser hin:
Delphi-Quellcode:
case zeichen of
  'a' : ;
  'b' : ;
end;
MfG
Fabian

Sir Rufo 2. Okt 2010 18:45

AW: Befehl zum pausieren
 
Bitte nicht auf True prüfen!
Delphi-Quellcode:
if (dieTastatur.zeichen='k') then
begin
  // NIE NIEMALS NICHT AUF TRUE PRÜFEN !!!!
  if (dieMaus.istGedrueckt {= true} ) then
  begin

  end
  else
  begin

  end;

end;
Die Gründe wurden zuhauf hier im Forum erläutert

Mesion 2. Okt 2010 19:38

AW: Befehl zum pausieren
 
Zitat:

Zitat von xZise (Beitrag 1053380)
Möchtest du das man mehrere Tasten gleichzeitig drücken kann?

Nein, es soll immer nur eine Funktion ausgeführt werden.

Zitat:

Zitat von xZise (Beitrag 1053380)
Außerdem, müsstest du doch, wenn man das k drückt, sagen, dass die Tastatur ein Zeichen weiter geht oder?

Ganz am Ende der ersten If-Verzweigung geht die Tastatur ein Zeichen weiter

Zitat:

Zitat von Sir Rufo (Beitrag 1053387)
// NIE NIEMALS NICHT AUF TRUE PRÜFEN !!!!

Ok, dann prüfe ich nicht auf true, scheint ja fast eine Straftat zu sein ^^


Mittlerweile habe ich es geschafft die Funktionen einzubauen, der einzige Schönheitsfehler ist jetzt nurnoch, dass ich bei meinen eigenen Funktionen, also mit dem Kreis, Rechteck und Linie, dass ich die Aktivierungstaste gedrückt halten muss, damit es funktioniert.

Delphi-Quellcode:
    meinStift.hoch;
    repeat
    meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);;
      if (dieMaus.istGedrueckt) then
      begin
        meinStift.runter;;
      end
      else
      begin
        meinStift.hoch;;
      end;

    if (dieTastatur.wurdeGedrueckt) then
    begin


      if (dieTastatur.zeichen='r') then
      begin
        meinStift.radiere;
      end;


      if (dieTastatur.zeichen='z') then
      begin
        meinStift.normal;
      end;


    If (dieTastatur.zeichen='k') then
    begin

      While dieMaus.istGedrueckt = true do
      begin
        meinStift.setzeLinienBreite(2);
        meinStift.bewegeBis(meinStift.hPosition,meinStift.vPosition);
        RadiusKreis:=(RadiusKreis+1);
        warte(10);
        meinStift.zeichneKreis(Radiuskreis);
        meinStift.hoch;
      end;
        meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
        meinStift.hoch;
        Radiuskreis:=0;
      end;


    If (dieTastatur.zeichen='e') then
    begin

      While dieMaus.istGedrueckt = true do
      begin
        meinStift.setzeLinienBreite(2);
        meinStift.bewegeBis(meinStift.hPosition,meinStift.vPosition);
        BreiteRechteck:=(BreiteRechteck+1);
        LaengeRechteck:=(LaengeRechteck+1);
        warte(10);
        meinStift.zeichneRechteck(BreiteRechteck,LaengeRechteck);
        meinStift.hoch;
      end;
        meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
        meinStift.hoch;
        BreiteRechteck:=0;
        LaengeRechteck:=0;
      end;




    If (dieTastatur.zeichen='l') then
    begin

      meinStift.bewegeBis(dieMaus.hposition,dieMaus.vposition);
      meinStift.hoch;

      While dieMaus.istGedrueckt = true do
      begin
        meinStift.runter;
        meinStift.zeichneKreis(3);
        meinStift.bewegeBis(meinStift.hPosition,meinStift.vposition);
        end;

    end;

     dieTastatur.weiter;
     end;


    until
    dieMaus.doppelklick;

Sir Rufo 2. Okt 2010 20:33

AW: Befehl zum pausieren
 
Zitat:

Zitat von Mesion (Beitrag 1053395)
Zitat:

Zitat von Sir Rufo (Beitrag 1053387)
// NIE NIEMALS NICHT AUF TRUE PRÜFEN !!!!

Ok, dann prüfe ich nicht auf true, scheint ja fast eine Straftat zu sein ^^

Es könnte sein, dass dein Programm extrem seltsam reagiert ... aber wie gesagt, steht hier im Forum an mehreren Stellen erläutert

xZise 2. Okt 2010 21:57

AW: Befehl zum pausieren
 
Zitat:

Zitat von Mesion (Beitrag 1053395)
[...]
Zitat:

Zitat von xZise (Beitrag 1053380)
Außerdem, müsstest du doch, wenn man das k drückt, sagen, dass die Tastatur ein Zeichen weiter geht oder?

Ganz am Ende der ersten If-Verzweigung geht die Tastatur ein Zeichen weiter[...]

Das ist aber zu spät. Ich habe dir doch das entsprechende Codesegement raus kopiert. Wenn du den Buchstaben k drückst, dann testest du darin ob der Buchstabe e gedrückt wurde. Jetzt verrate mir mal, wie man gleichzeitig eine Taste drücken soll, die zugleich k und e sein soll :stupid:

Und der Schönheitsfehler ist schnell erklärt:
Wenn du radieren willst drückst du r und der "Pinsel" ist im Radiermodus. Wenn du aber einen Kreiswachsen lassen willst, dann sagst du nicht: Mache einen Kreis und er wird jedes mal ein größer wenn er in der äußeren Schleife ist (das könnte auch etwas schwieriger werden).

Übrigens rücke das doch etwas schöner ein ;) aktuell verwirrt es zumindest mich, dass der Test ob der Buchstabe k gedrückt ist, auf der gleichen Höhe ist, wie der Test ob die Maus gedrückt ist, und dabei eigentlich eine Ebene tiefer ist.

MfG
Fabian

PS: Wenn du
Delphi-Quellcode:
if (x = true) then
schreibst, dann ist das quasi nix anderes als:
Delphi-Quellcode:
if (x = true) = true then
. Wenn du mal
Delphi-Quellcode:
if (x = false) then
hast, dann ist das Äquivalent
Delphi-Quellcode:
if (not(x)) then
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 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