![]() |
Realtime Input? Thread?
hi there, lets say i have this simple code
i:=0; repeat i:=i+1; until i=10; and i will enter numbers from a edit component - i write a number to edit and press the button, then the cycle continues like :
Delphi-Quellcode:
and it will looks like
i:=0;
repeat Memo1.Lines.Append('Enter field values '+IntToStr(i)); P[i]:=%MyInput%; //Edit1.text; i:=i+1; until i=10; > program starts > it displays -> Enter field values 1 > then i write the values to an edit component and press the ok button //smt like the program stops and w8 for input from anothe component > then again it displays -> Enter field values 2 > then again enter the numbers to edit component and click ok it looks simple, but i have no clue how to do this, how to stop a procedure at a certain point, work with another procedure and the result inputs and continue from the neeede point maybe to give the procedure to a threat, but thats also :/ for me thanks |
Re: Realtime Input? Thread?
why you dont try
Delphi-Quellcode:
?
i:=0;
repeat inputbox('Enter Number', ''Enter field values '+IntToStr(i)', '') // here i changed P[i]:=%MyInput%; //Edit1.text; i:=i+1; until i=10; The code waits while the Inputbox is diplayed. Or don`t I understand the question? |
Re: Realtime Input? Thread?
ok thanks, thats it, but can i make my custom input box?
|
Re: Realtime Input? Thread?
Liste der Anhänge anzeigen (Anzahl: 1)
Yes you can. go to File - New - (in german version "Weitere") the rest is shown in the screenshot of course you can use the red marked.
you can add buttons, fields ... . But you have to write every funktion by own hand. like this:
Delphi-Quellcode:
edit: In D7 it`s in File - New - (in german version "Weitere") in the register "Dialogs"
procedure TMainForm.pmAddClick(Sender: TObject);
// Job hinzufügen begin // here you can set standart values if you need TEditChange.ShowModal; if not (TEditChange.ModalResult = mrCancel) then // maybe use mrOK and leave "not" begin // do sometheng whith the Input Data lvSourceDestination.Items.Add; lvSourceDestination.Items[lvSourceDestination.Items.Count-1].SubItems.clear; lvSourceDestination.Items[lvSourceDestination.Items.Count-1].SubItems.add(TEditChange.eSourcePath.Text); lvSourceDestination.Items[lvSourceDestination.Items.Count-1].SubItems.add(TEditChange.eDestinationPath.Text); lvSourceDestination.Items[lvSourceDestination.Items.Count-1].SubItems.add(TEditChange.eApplicationPath.Text); // reset the edit fields, if you don`t do the old is shown at next show TEditChange.eSourcePath.Text := ''; TEditChange.eDestinationPath.Text := ''; TEditChange.eApplicationPath.Text := ''; end end; |
Re: Realtime Input? Thread?
but thats not exactly what i wanted... i will make smt like this // StopProcedure(Haf); and ContinueProcedure(Haf); this procedures dont exist, but i will make smt like this
Delphi-Quellcode:
i hope its a bit clearer now :-D
procedure Haf;
var i:integer; begin i:=0; repeat StopProcedure(Haf); //this stops the procedure, but local variables, nothing will be lost, smt like it freezes the procedure for a while input[i]:=Edit1.text; i:=i+1; until i=3; end; //we can work with the program and when we press Button, Haf will contiue procedure ButtonClick; begin ContinueProcedure(Haf); end; |
Re: Realtime Input? Thread?
You can do this with WaitForSingleObject and an Event
Your function
Delphi-Quellcode:
Create the event:
procedure Haf;
var i:integer; begin i:=0; repeat //////Wait/////////////////////////////////// repeat WaitResult := DWORD WaitForSingleObject(HANDLE hHandle, { handle of object to wait for} DWORD dwMilliseconds { time-out interval in milliseconds}); // for Handele use "event" and you must set an timeout that the funktion returns and Messages are viewed and worked on if WaitResult <> WAIT_OBJECT_0 then begin Application.ProcessMessages; end; until WaitResult = WAIT_OBJECT_0; ///////////////////////////////////////////// // here you can use reset event if you want to wait contiously input[i]:=Edit1.text; i:=i+1; until i=3; end;
Delphi-Quellcode:
Set the event:
procedure TForm1.FormShow(Sender: TObject);
begin event := HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // pointer to security attributes BOOL bManualReset, // flag for manual-reset event BOOL bInitialState, // flag for initial state LPCTSTR lpName // pointer to event-object name ); end;
Delphi-Quellcode:
Close the event:
procedure ButtonClick;
begin SetEvent(event) end;
Delphi-Quellcode:
Now a lot of Pseudocode (not tested)
procedure TForm1.FormClose(Sender: TObject);
begin CloseHandle(event) end; for additional informatin wiew the SDK. |
Re: Realtime Input? Thread?
If it runs in a separate thread
![]() ![]() However, if you suspend the thread from the outside, the context is undetermined. So if you want the thread to be suspended at a certain position, it may suspend itself using SuspendThread and be woken up from another thread using ResumeThread. Note: if you have the usual Delphi-like architecture of an application, there is only one main thread with a message queue. So to achieve the above you need to have a secondary thread at least. And be sure to sync them because the VCL does not like threads too much ;) |
Re: Realtime Input? Thread?
So you have like 10 input params you want to fetch from the user?
Why not just make a second form:
Delphi-Quellcode:
EDIT: if you don't know how to make a form act modal, there should be enough material in the forum. or just ask ;)
for i := 0 to 9 do
if form2.ShowModal = mrOK then begin values[i] := form2.some_public_field_assigned_before_closing; end else begin ShowMessage('Naaah... don''t press cancel!'); // ;-) Break; end; |
Re: Realtime Input? Thread?
Liste der Anhänge anzeigen (Anzahl: 1)
@Olli the mainform is a thread too, and bacause of this you can use the wait function too.
Here i work with events and thay you can set from everywhere in the programm. I made a little test program: |
Re: Realtime Input? Thread?
thanks for your help, threat are looking good, but what am i making wrong, why does it do - nothing - ?
Delphi-Quellcode:
var fiber:TThread;
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin fiber:=TTHread.Create(false); //fiber.Synchronize(???); i:=0; repeat Memo1.Lines.Append(IntToStr(i)); fiber.Suspend; i:=i+1; until i=3; fiber.Terminate; end; procedure TForm1.Button2Click(Sender: TObject); begin fiber.Resume; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz