PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mauszeiger / Parallel Processes (Delphi)



derBenny
04.12.2004, 17:28
Wie kann ich in einem Delphi-Programm eigene Mauszeiger verwenden? Ich brauche einen Stift- oder Pinselcursor. In welcher Größe und welchem Dateiformat muss ich das Bild des Cursors speichern, wenn ich ihn gezeichnet habe? Wie hol' ich das Ding in mein Projekt rein?

Wie realisiere ich "Parallel Processes" (so heißen sie zumindest beim RPG-Maker 2000), also Methoden, die im Hintergrund schleifenartig ablaufen. Wie kann ich zum Beispiel erreichen, dass eine Prozedur jede Sekunde die aktuelle Systemzeit in eine Panel.Caption oder wohin auch immer schreibt, oder die Farbe eines Panels immer wieder von rgb(0,0,0) auf rgb(255,255,255) und zurück überblendet. Man soll das Programm nebenbei ganz normal weitersteuern können.
Dieser Frage schließt sich natürlich auch die Frage an, wie man eine wait(ms)-Funktion programmiert, die es trotzdem erlaubt, dass man das Programm ganz normal weiter verwendet, wie oben bereits erwähnt. Ich hab's mit der sleep(ms)-Funktion versucht, aber die hält den gesamten Programmablauf an.
Außerdem würde ich gerne wissen, wie ich erreiche, dass ein Formular nach jedem Schleifenablauf aktualisiert wird. Wenn ich zum Beispiel ein Panel um x Punkte verschieben und diese Verschiebung auch zeigen will, würde ich folgende Prozedur verwenden:
procedure PanelNachRechtsVerschieben(x: Integer);
var i, neuePosition: Integer;
begin
neuePosition := Panel.Left + x;
while (Panel.Left <> neuePosition) do
begin
if (Panel.Left < neue Positon) then Panel.Left := Panel.Left + 1
else if (Panel.Left > neue Positon) then Panel.Left := Panel.Left - 1;
sleep(10); // 0,01 Sekunden warten
end;
end;Wenn ich aber diesen Code verwenden würde, würde das Panel beim Bewegen eine Spur hinterlassen oder es würde erst nach einer Sekunde an seiner neuen Position angezeigt werden, ohne, dass es sich je dazwischen befunden hat. Wie erreiche ich also, dass das Formular in jedem Schleifenablauf aktualisiert wird, um das Panel alle 0,01 Sekunden auf seiner neuen Position anzeigen zu lassen?

Ich hoffe, irgendwer kann mir helfen.

Ineluki
05.12.2004, 14:06
das sind sehr komplexe dinge, die du da ansprichst ... und ich muss leider gleich weg ...

schau mal in der Hilde unter Application.ProcessMessages, unter TTimer und unter TThread.

Was die Mauszeiger angeht, so muessen die im CUR-Format vorliegen ... naeheres findest du sicherlich in der Delphi-Hilfe unter TMouse und in der WinAPI unter Mouse, Cursor oder vielleicht auch bei LoadResource

Was den waitbefehl angeht, kannst du dafuer den API befehl Sleep(ms) verwenden ... allerdings ist das nicht wirklich eine gute Wahl.

Ich glaube du solltest vom Denkschema der linearitaet von Programmen weggehen ... Windows programmiert man Ereignisorientiert. Das heisst, das programm wartet nicht selber, das programm laesst warten. Man definiert Funktionen, die ausgewuehrt werden, wenn bestimmt ereignisse eintreten, z.B. wenn der User auf ein Fenster klickt, oder wenn ein Timer ein Signal dazu gibt.

So muss jetzt weg, hoffe, ich konnte helfen ...

Gruss Ineluki

Freezy
05.12.2004, 15:18
Auch eine möglichkeit währe, das ganze in das OnIdle event zu packen. Dann wird deine Schleiffe immer ausgeführt wenn das Programm gerade nichts anderes zu tun hat. Das findet vorallem im Spielebereich einsatz und wird auch von Onsetsu verwendet :D

Erstmal declarierst du deine Schleiffe:

Procedure Schleiffe(Sender: TObject; var done: Boolean);
Die Implementation sieht wie folgt aus:

Procedure Schleiffe(Sender: TObject; var done: Boolean);
begin
done := false;
//Hier der ganze code rein
end;
Jetzt musst du der Application noch sagen das genau diese Procedur ausgeführt werden soll wenn sie gerade nichts anderes zu tun hat. Mach das aber erst wenn du alles initzialiesiert hast (am besten am ende der Form.OnCreate Events)

Application.OnIdle := Schleiffe;
Das war alles. wenn du das wieder stoppen willst schreib einfach:

Application.OnIdle := nil;

derBenny
05.12.2004, 17:44
@Freezy:
OnIdle heißt also: Wenn gerade nichts zu tun ist? Wird die Prozedur "Schleiffe" in deinem Beispiel dann immer wieder ausgeführt oder muss man in ihrem Rumpf noch eine Schleife benutzen?

Ich werde mir die vorgeschlagenen Hilfethemen mal anschauen.

Freezy
05.12.2004, 22:09
Die wird immer ausgeführt, schnell hintereinander wenn gerade nichts besseres zu tun ist und solande du nich Application.OnIdle=nil aufrufst. Also brauchst du keine extra schleiffe.

derBenny
07.12.2004, 17:32
Die wird immer ausgeführt, schnell hintereinander ...Und was verwende ich dann für einen wait-Befehl, damit die Prozedur nicht so viel Rechenzeit beansprucht? Mit sleep(ms) erreiche ich ja das genaue Gegenteil. Oder spielt das keine Rolle?

Aber noch eine andere Frage: Wie aktualisiere ich ein Formular? Ich habe das Problem unten in meinem ersten Beitrag geschildert.

-edit-
@Freezy: Danke, ich werd's mal ausprobieren.

Freezy
07.12.2004, 22:26
Wenn du meinst das die Procedur dann nur alle X Millisecunden aufgerufen wird tu das:

Als erstes brauchst du Windows in der Uses-klausel... dann declarierst du irgendwo

LastTime: Integer
und fügst folgendes zu deiner Schleiffenmethode hinzu:

Procedure Schleiffe(Sender: TObject;Var done: Boolean);
begin
done := false;
if GetTickCount < LastTime + 200 then
Exit;
LastTime := GetTickCount;
//Hier dein Code
end;

Wenn seit dem letztem aufruf von Schleiffe nicht 200ms vergangen sind wird diese wieder mit exit beendet.

Aktualisieren? Hmm... ka... versuchs mal mir RePaint oder sowas ähnlichem Oô