Avatar billede skovjuul Nybegynder
05. juli 2007 - 20:49 Der er 16 kommentarer og
2 løsninger

Hvordan laver jeg events på et dynamisk object?

Hola

Jeg har en TGsm (myGsm) komponent som jeg opretter i en tråd der skal sende sms'er via et modem.

Jeg kan dog ikke nedlægge objektet igen før sms'en er sendt, ellers kommer den ikke afsted så jeg har brug for at sætte en bool ved
isSending:= true;
myGsm.SendMsg(phonenmb,msg);
while isSending do
  sleep(200);

hvordan får jeg sat isSending := false i myGsm's onSmsSent event?
Eller hvordan gør man ellers sådan noget?

Tak
Jesper
Avatar billede kfz Nybegynder
06. juli 2007 - 02:18 #1
umiddelbart ville jeg gå ind og lave en ny komponent, med baggrund i den du allerede har, hvis du smider et link til komponenten, skal jeg nok prøve at få tid til at lave det her en af dagene.
Avatar billede skovjuul Nybegynder
06. juli 2007 - 02:55 #2
Tak for tilbudet men det er en forholdsvis kompleks komponent som jeg har været ude i byen og købe.

Kan det virkelig ikke lade sig gøre at tilgå en komponents onxxx -events medmindre man gør det efter de er placeret på en form?
Avatar billede hrc Mester
06. juli 2007 - 08:04 #3
Sagtens. Du skal lave en procedure med parametre ligesådan som der sker når du dobbeltklikker på eventen i din Object inspector. Faktisk er det hvad du skal gøre, dobbeltklikke. Proceduren fylder du med kode og flytter derhen hvor du har brug for den.

procedure TMyThread.MyProcedureThatHandlesErrors(Sender: TObject; ..);
begin
end;

Hvis du opretter din TGsm i en tråd:

  inherited Create(true);
  FreeOnTerminate := true;
  fGSM := TGSM.Create(nil);
  fGSM.OnFailure := MyProcedureThatHandlesErrors;

  .. og så husker du lige at frigive fGSM igen, ikke? Jeg plejer at override trådens constructor og destructor og klare oprettelse og frigivelse der.
Avatar billede skovjuul Nybegynder
06. juli 2007 - 20:57 #4
Hola

kan jeg ikke i en funktion gøre det samme da gsm objektet kun skal oprettes i halvdelen af tilfældene?
jeg har en

function SendSms();
begin
  fGSM := TGSM.create(nil);
  try
  //some code
  finally
    fGSM.free;
  end;
end;

Lige efter gsm.create ville jeg så sætte objektets OnSmsSent event til en funktion jeg selv har lavet men den brokker sig over at parametrene ikke passer (eller sådan noget, er på arbejde så kan ikke lige huske den præcise formulering).
OnSmsSent eventet ser sådan her ud:
OnSmsSent(Sender: TObject; aMem: string; idSms: integer; aSms: TnrPduSms);

Så hvordan sætter jeg nu min funktion til at køre på eventet? Skal jeg oprette tomme variabler og sætte ind i parameterlisten? Bliver de så fyldt ud eller hvordan foregår det?

Og til fremtidig reference, kan min egen funktion også tage parametre udover Sender:Tobject (som altid er nil i en tråd?) ?

Takker
Jesper
Avatar billede skovjuul Nybegynder
07. juli 2007 - 00:42 #5
Hmm.... med egne variabler: OnSmsSent(nil,SmsMem, SmsNmb, PduSms) := SmsIsSent;
virker så ikke :) Får en "Left side cannot be assigned to" fejl.


Noget helt andet som jeg nok bliver punket for efter det her lille eksempel: hvad er en god navnekonvetion? :)
Avatar billede kfz Nybegynder
07. juli 2007 - 02:26 #6
som jeg sagde i det første indlæg, nedarv en ny komponent fra TGSM, så har du fuld kontrol.
Avatar billede skovjuul Nybegynder
07. juli 2007 - 02:33 #7
Bare en lidt voldsom løsning hvis det kan gøres ved at ændre komponentens Onxxx-event. Ellers skal jeg jo til at lave en ny komponent hver gang jeg vil ha' den til at gøre noget forskelligt?
Avatar billede kfz Nybegynder
07. juli 2007 - 11:28 #8
nej, det eneste du reelt ændrer er den onxxx-event, resten af koden arver den fra TGSM, det eneste du ellers skal være opmærksom på, er at få kopieret published delen, fra originalen.
Avatar billede skovjuul Nybegynder
09. juli 2007 - 00:38 #9
Nå, jeg slap heldigvis i denne omgang, fandt ud af at der var en .IsBusy variabel jeg kunne checke mod.

Smid et svar begge to og mange tak for hjælpen.

Jesper
Avatar billede kfz Nybegynder
09. juli 2007 - 02:11 #10
ok, glad for at du fandt en løsning, men hvis du en anden gang står i et problem hvor du skal have ændret en onxxx event, så er det altså en overkommelig opgave.
Avatar billede kfz Nybegynder
09. juli 2007 - 02:13 #11
kodemæssigt ville det dog have været pænere at lave en ny onmessagesent event, end at bruge sleep. men det er dog en brugbar løsning i dit tilfælde.
Avatar billede skovjuul Nybegynder
09. juli 2007 - 02:42 #12
Hmm.. hvordan ville du så vente på at den er blevet sendt før du går videre?
Avatar billede kfz Nybegynder
09. juli 2007 - 11:46 #13
så kunne det evt. se sådan her ud

procedure sendsms;
begin
  fGSM := TGSM.create(nil);
  //some code
  end;
end;

procedure onmessagesent(sender: Tobject);
begin
fGSM.free;
end;
Avatar billede skovjuul Nybegynder
09. juli 2007 - 15:19 #14
Problemet med ovenstående er at resten af Some Code ikke skulle fortsætte før onmessagesent var blevet triggered, så derfor ser jeg ingen anden løsning end at bruge sleep?

SendSms bliver kaldt fra en anden funktion der har checket på om det er en mail eller en sms der skulle sendes. Når beskeden så er blevet sendt vender den tilbage til den kaldende funktion som færdiggører opdateringer af et par tabeller samt loggen på min main-form.
Avatar billede hrc Mester
10. juli 2007 - 19:02 #15
Har du overvejet at poste en hjemmelavet "message"? Den vil komme sidst i rækken af message-køen.
Avatar billede skovjuul Nybegynder
11. juli 2007 - 00:47 #16
hrc det lyder som noget du gerne må uddybe hvis du har tid/lyst eller poste et link af en art :)

Under alle omstændigheder så smid et svar så du kan få nogle point for ovenstående hjælp.
Avatar billede hrc Mester
11. juli 2007 - 18:10 #17
Du laver en procedure

const
  WM_DOSOMECODE = WM_USER + $0001;


type
  TMyFOrm = class(TForm)
    .. 
    procedure DoSomeCodeNow(aMSG : TMessage); message WM_DOSOMECODE;
  end;

...

procedure DoSomeCodeNow(aMSG : TMessage);
begin
  DoSomeCode;
end;

I din OnMessageSent-event

begin
  PostMessage(fMyForm.Handle,WM_DOSOMECODE,0,0); // (eller SendMessage, eller måske Perform)

Det kræver at din OnMessageSent kender formen der skal reagere på eventen, her angivet fMyForm.Handle.
Avatar billede skovjuul Nybegynder
11. juli 2007 - 19:27 #18
Tak for det hrc, det ligner noget jeg kan eksperimentere med på en kold vinterdag :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester