Avatar billede psycosoft-funware Nybegynder
10. april 2006 - 08:50 Der er 41 kommentarer og
2 løsninger

placering af kode i en komponents event under runtime

hej experter

jeg godt det måske er et lamt spm, men jeg er alligevel kommet i tvivl...

jeg har opbygget en procedure der kan konvertere nogle formater til et andet, men efter som jeg har 2 stk progressbars (en der viser den nuværende progress og en der viser hvornår processen vil være færdig) de komponenter jeg har har alle en onProgress event, men efter som der er forskellige indstillinger m.m. har jeg brug for at placere forskellig kode i onProgress og i onDone - er det muligt under runtime, og i så fald hvordan...? :-)


/FunteX! :-)
Avatar billede kroning Nybegynder
10. april 2006 - 09:40 #1
Den eneste mulighed jeg lige kan komme i tanke om er en stak if sætninger:

if indstil_sådan then
  //gør sådan
else
if indstil_sådan then
  //går sådan
osv.

ja en anden mulighed kunne self. være at du ændre på OnProgress og OnDone når du ændre på indstillingerne:

procedure OnIndstillingChange;
begin
if indstil_sådan then
begin
  OnProgress:=No1OnProgress
  OnDone:=No1OnDone;
end
else
if indstill_sådan then
begin
  OnProgress:=No2OnProgress
  OnDone:=No2OnDone;
end
else
osv.
Avatar billede psycosoft-funware Nybegynder
10. april 2006 - 09:45 #2
tusint tak kroning, smid et svar og der er point :D

et lille offtopic:
kan det virkelig passe at nogle steder virker en case-of sætning mere efektivt end if-then eller if-then-else?

/FunteX! :-)
Avatar billede kroning Nybegynder
10. april 2006 - 09:49 #3
Vil du ikke lige vente til folk komme hjem fra arbejde i aften, måske har en et bedre forslag?
Om en case of er mere effektiv end en if-then-else ved jeg ikke, men så længe ingen af dem skal udføres flere 1000 gange i sekundet så skal man nok bare bruge dem man syntes er lettest i det aktuelle tilfælde.
Avatar billede psycosoft-funware Nybegynder
10. april 2006 - 09:53 #4
jo, du siger noget... :)

med case-of og if-then, har jeg oplevet hvor if-then ikke udførte koden korrekt og gav access violations, hvor imod en case-of gav det ønskede resultat og der kom ikke nogen access violations...

jeg syntes bare at et er mærkeligt at der hvor man vil mene at en if-the skulle kunne klare arbejdet fejler den... :)

/FunteX! :-)
Avatar billede kroning Nybegynder
10. april 2006 - 10:17 #5
Hvis den kommer med en "access violations" må det jo være en fejl i din kode uanset om du bruger if-then eller case :-)
Avatar billede psycosoft-funware Nybegynder
10. april 2006 - 10:27 #6
snadt nok... :)
Avatar billede psycosoft-funware Nybegynder
10. april 2006 - 10:28 #7
ups, kom til at skrve forkert: -> *sandt nok...
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 12:58 #8
kroning, jeg prøvede med at lave et par procedure der skal klare konverteringen, men når jeg skriver fx FlacOut.OmProgress := DoFlacToApe, så får jeg denne hyggelige error fra compileren: [Error] uConvDlg.pas(220): Incompatible types: 'method pointer and regular procedure'

hvordan løser jeg dette...? :-)

/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 13:54 #9
Din DoFlacToApe procedure skal være defineret i en class og ikke stå alene.
Avatar billede kroning Nybegynder
11. april 2006 - 13:59 #10
Eller? Hvordan har du defineret din OnProgress procedurer. Er det en procedure of object; eller hvad?
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 14:03 #11
OnProgress og OnDone er to events i en række komponenter... :)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 14:04 #12
jeg har defineret det som en normal procedure, under implementation delen...


/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 14:06 #13
Prøv at definere den i en class.
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 14:19 #14
hehe, så er det bare hvilken klasse den skal nedarve fra... :)

for alle komponenter der er af typen [format]in nedarver klasserne fra TACSFileIn og for  [format]Out nedarver de fra klassen TACSFileOut...

OnDone nedarver fra TOutputDoneEvent og OnProgress nedarver fra TOutputProgressEvent..:)


/FunteX! :-)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 14:20 #15
ACS_Classes.pas -> type TOutputProgressEvent = procedure(Sender : TComponent) of object;
Avatar billede kroning Nybegynder
11. april 2006 - 14:32 #16
Nej det er ikke det jeg mener, hvis du f.eks. har defineret din DoFlacToApe sådan:
procedure DoFlacToApe(noegt : blabla);

under f.eks. implementation, så mener jeg at du ganske enkelt skal flytte den op under f.eks. private delen af din class, f.eks. i din mainform. således:

private
  { Private declarations }
  procedure DoFlacToApe(noegt : blabla);
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 14:43 #17
okay, nu har jeg fanget den... :)

men når jeg så opbygger en procedure, hvordan skal det så se ud for at dette kan lade sig gøre når procedure kaldes med disse parametre: DoFlacToApe(FlacOut.OnProgress, FlacOut.OnDone)... så der hvor procedure koden er defineret placere den det kode der skal udføres i disse events at runtime...? :)

/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 14:52 #18
Så er jeg lige tabt igen :), var din DoFlacToApe ikke en procedure af typen TOutputProgressEvent? Hvis den er så skal du skrive som du selv tidligere skrev:
FlacOut.OnProgress := DoFlacToApe;

dvs. at din FlacOut klasse vil kalde din DoFlacToApe.
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 15:01 #19
jeg havde startet med at lave en procedure for hver type filkonvertering.

det er så meningen at hvis brugeren har valgt at konvertere nogle flac filer til ape format kaldes DoFlacToApe proceduren med parametrene (FlacOut.OnProgress, FlacOut.OnDone). i selve proceduren skal der være defineret et "reglsæt" for hvad der skal ske med disse to typer filer + beregning af diverse ting og sager.

men efter som jeg har flere typer konverterings processer fx FlacTomp3, FlacToOgg, FlacToWav osv skal jeg bestemme hvad der skal foregå ved hvert valg :)

/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 15:27 #20
ok, hvad med dette:
procedure DoFlacToApe(OnProgress, FlacOut : TOutputProgressEvent);
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 15:46 #21
jeg har lavet denne procedure:
procedure DoWavToOgg(OnProgress: TOutputProgressEvent; OnDone: TOutputDoneEvent);
begin
  //så er det bare her jeg er helt lost... :S
end;


og det virker med at kalde den sådan her:
DowavToOgg(ConvDlg.VorbisOut.OnProgress, ConvDlg.VorbisOut.OnDone);


/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 15:58 #22
Ja jeg er ikke helt med, svært uden mere kode, men i din DoWavToOgg kan du jo kalde OnProgress eller OnDone men jeg kan ikke lige se formålet med DoWavToOgg proceduren.
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 16:01 #23
procedure SetConversionMethod(InputFile: String; OutputFile: String);
var
  i: integer;
begin
  i := 0;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ogg') and (LowerCase(ExtractFileExt(OutputFile)) = '.wav')  then i := 0;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ogg') and (LowerCase(ExtractFileExt(OutputFile)) = '.mp3')  then i := 1;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ogg') and (LowerCase(ExtractFileExt(OutputFile)) = '.ape')  then i := 2;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ogg') and (LowerCase(ExtractFileExt(OutputFile)) = '.fla') or (LowerCase(ExtractFileExt(OutputFile)) = '.flac')  then i := 3;
  if (LowerCase(ExtractFileExt(InputFile)) = '.mp3') and (LowerCase(ExtractFileExt(OutputFile)) = '.ogg')  then i := 4;
  if (LowerCase(ExtractFileExt(InputFile)) = '.mp3') and (LowerCase(ExtractFileExt(OutputFile)) = '.fla') or (LowerCase(ExtractFileExt(OutputFile)) = '.flac')  then i := 5;
  if (LowerCase(ExtractFileExt(InputFile)) = '.mp3') and (LowerCase(ExtractFileExt(OutputFile)) = '.ape')  then i := 6;
  if (LowerCase(ExtractFileExt(InputFile)) = '.mp3') and (LowerCase(ExtractFileExt(OutputFile)) = '.wav')  then i := 7;
  if (LowerCase(ExtractFileExt(InputFile)) = '.fla') and (LowerCase(ExtractFileExt(OutputFile)) = '.ogg')  then i := 8;
  if (LowerCase(ExtractFileExt(InputFile)) = '.fla') and (LowerCase(ExtractFileExt(OutputFile)) = '.mp3')  then i := 9;
  if (LowerCase(ExtractFileExt(InputFile)) = '.fla') and (LowerCase(ExtractFileExt(OutputFile)) = '.ape')  then i := 10;
  if (LowerCase(ExtractFileExt(InputFile)) = '.fla') and (LowerCase(ExtractFileExt(OutputFile)) = '.wav')  then i := 11;
  if (LowerCase(ExtractFileExt(InputFile)) = '.flac') and (LowerCase(ExtractFileExt(OutputFile)) = '.ogg')  then i := 12;
  if (LowerCase(ExtractFileExt(InputFile)) = '.flac') and (LowerCase(ExtractFileExt(OutputFile)) = '.mp3')  then i := 13;
  if (LowerCase(ExtractFileExt(InputFile)) = '.flac') and (LowerCase(ExtractFileExt(OutputFile)) = '.ape')  then i := 14;
  if (LowerCase(ExtractFileExt(InputFile)) = '.flac') and (LowerCase(ExtractFileExt(OutputFile)) = '.wav')  then i := 15;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ape') and (LowerCase(ExtractFileExt(OutputFile)) = '.ogg')  then i := 16;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ape') and (LowerCase(ExtractFileExt(OutputFile)) = '.wav')  then i := 17;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ape') and (LowerCase(ExtractFileExt(OutputFile)) = '.mp3')  then i := 18;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ape') and (LowerCase(ExtractFileExt(OutputFile)) = '.fla') or (LowerCase(ExtractFileExt(OutputFile)) = '.flac') then i := 19;
  if (LowerCase(ExtractFileExt(InputFile)) = '.wav') and (LowerCase(ExtractFileExt(OutputFile)) = '.ogg')  then i := 20;
  if (LowerCase(ExtractFileExt(InputFile)) = '.wav') and (LowerCase(ExtractFileExt(OutputFile)) = '.mp3')  then i := 21;
  if (LowerCase(ExtractFileExt(InputFile)) = '.wav') and (LowerCase(ExtractFileExt(OutputFile)) = '.fla') or (LowerCase(ExtractFileExt(OutputFile)) = '.flac')  then i := 22;
  if (LowerCase(ExtractFileExt(InputFile)) = '.wav') and (LowerCase(ExtractFileExt(OutputFile)) = '.ape')  then i := 23;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ogg') and (LowerCase(ExtractFileExt(OutputFile)) = '.ogg')  then i := 24;
  if (LowerCase(ExtractFileExt(InputFile)) = '.mp3') and (LowerCase(ExtractFileExt(OutputFile)) = '.mp3')  then i := 25;
  if (LowerCase(ExtractFileExt(InputFile)) = '.fla') and (LowerCase(ExtractFileExt(OutputFile)) = '.fla')  then i := 26;
  if (LowerCase(ExtractFileExt(InputFile)) = '.flac') and (LowerCase(ExtractFileExt(OutputFile)) = '.flac')  then i := 27;
  if (LowerCase(ExtractFileExt(InputFile)) = '.ape') and (LowerCase(ExtractFileExt(OutputFile)) = '.ape')  then i := 28;
  if (LowerCase(ExtractFileExt(InputFile)) = '.fla') and (LowerCase(ExtractFileExt(OutputFile)) = '.flac')  then i := 29;
  if (LowerCase(ExtractFileExt(InputFile)) = '.flac') and (LowerCase(ExtractFileExt(OutputFile)) = '.fla')  then i := 30;
  case I of
  0: begin
      end;
  1: begin
      end;
  2: begin
      end;
  3: begin
      end;
  4: begin
      end;
  5: begin
      end;
  6: begin
      end;
  7: begin
      end;
  8: begin
      end;
  9: begin
      end;
  10: begin
      end;
  11: begin
      end;
  12: begin
      end;
  13: begin
      end;
  14: begin
      end;
  15: begin
      end;
  16: begin
      end;
  17: begin
      end;
  18: begin
      end;
  19: begin
      end;
  20: begin
        DowavToOgg(ConvDlg.VorbisOut.OnProgress, ConvDlg.VorbisOut.OnDone);
      end;
  21: begin
      end;
  22: begin
      end;
  23: begin
      end;
  24: begin
      end;
  25: begin
      end;
  26: begin
      end;
  27: begin
      end;
  28: begin
      end;
  29: begin
      end;
  30: begin
      end;
  end;
end;

i denne kode bestemmer jeg hvilken metode der skal benyttes til at konvertere imellem, fx mp3 til ogg eller ogg til wav. :)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 16:05 #24
denne forespørgelse bliver sendt når brugeren klikker konverter.
grunden til at jeg gør det således er at der er flere forskellige filtyper der bliver valgt som kilde, fx .mp3, .ogg, .wav.  og der er valgt et destinations format, fx .ape.. så under runtime skal jeg så bestemme hvilken input og output komponenter der skal "snakke samme" afhængig af hvilke filtyper der skal konverteres :)

/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 16:15 #25
Så du har altså en stak komponenter der kan konvertere mellem fil typer, og hver af disse komponenter har en OnProgress og en OnDone event. Hvorfor så ikke bare sætte disse 2 events for alle komponeter en gang for alle ved program start.
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 16:27 #26
ja, alle Output komponenterne har OnProgress og OnDone :)
output komponenterne har et Input property, hvor man kan vælge fx FlacIn. dvs at man linker 2 komponenter sammen fx flacIn og VorbisOut = flac2ogg konvertering.

hvordan havde du ellers tænkt dig at dette problem kunne løses...? jeg kan godt sende programmet til dig, så du kunne få et bedre billede af hvad jeg snakker om, hvis det er OK... :)

/FunteX! :-)
Avatar billede kroning Nybegynder
11. april 2006 - 16:33 #27
Det er ok
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 19:52 #28
er det ikke sådan noget i den stil? :http://delphi.about.com/library/weekly/aa102505a.htm
Avatar billede kroning Nybegynder
11. april 2006 - 20:31 #29
Jeg er stadig tom for ideer.
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 20:34 #30
okay, vil det sige at man er helt ude i en Object Pascals dybe kroge...? :-)
Avatar billede kroning Nybegynder
11. april 2006 - 20:38 #31
Næ, det tror jeg egentlig ikke, problemet er nok bare at jeg ikke har fattet hvad det er du vil :-), men ham der lige kan se løsningen holder nok påske ferie :)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 20:51 #32
okay....
ser du, i runtime kender programmet ikke hvilken filtyper den skal konvertere til og fra. derfor tænker jeg i baner som med TGraphic klassen hvor man kan ikke ved hvilken klasse man skal oprette, og ved at kigge på filefternavn bestemme at lave en nedarvet klasse (fx TJpegImage, eller TBitmap) hvor man bestemmer det i runtime.

der vil jeg så lave en række procedure som man kan henvise den pågældene OnDone og OnProgress.

hvis vi nu siger at brugeren tilføjer 2 ogg filer 4 ape filer og 6 wav filer.
brugeren har valgt at filerne skal konverteres til mp3.

så er det meningen at SetConversionMethod løber igennem og ser hvilken metoder der skal bruges. i dette tilfælde skal procedurene OggToMp3, ApeToMp3 og WavToMp3 tages i brug. i hver af disse procedure er der angivet hvad der skal foretages i OnProgress og i OnDone. :)

/FunteX! :-)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 20:52 #33
det er det jeg skal have til at spille sammen... :)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 21:05 #34
procedure TConvDlg.DoWavToOgg(DoProgress: TOutputProgressEvent; DoDone: TOutputDoneEvent);
  procedure GoProgress;
    begin
      ConvDlg.LblCurretProg.Caption := IntToStr(ConvDlg.CurrentProg.PercentDone) + '%';
      ConvDlg.CurrentProg.Progress := ConvDlg.CurrentProg.Progress + 1;
    end;
  procedure GoDone;
    begin
        ConvDlg.Caption := ConvDlg.Caption + ' Done';
    end;
  begin
  ConvDlg.VorbisOut.Input := ConvDlg.WaveIn;
  end;

nu har jeg lavet dette nummer, procedure TConvDlg.DoWavToOgg(DoProgress: TOutputProgressEvent; DoDone: TOutputDoneEvent); er erklæret under private.

hvordan får jeg assigned GoProgress til OnProgress og det samme med GoDone, så det kan compiles...? :)
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 21:27 #35
denne kode virker:

procedure TConvDlg.DoWavToOggOnProgress(Sender: TComponent);
begin
  ConvDlg.LblCurretProg.Caption := IntToStr(ConvDlg.CurrentProg.PercentDone) + '%';
  ConvDlg.CurrentProg.Progress := ConvDlg.CurrentProg.Progress + 1;
end;

procedure TConvDlg.DoWavToOggOnDone(Sender: TComponent);
begin
  ConvDlg.Caption := ConvDlg.Caption + ' Done';
end;

men hvordan kan jeg sammensætte disse to stykker kode til een procedure? :)
Avatar billede kroning Nybegynder
11. april 2006 - 21:29 #36
Du definere 2 procedure i f.eks. din main forms private sektion
procedure OnProgress(Sender : TComponent);
procedure OnDone(Sender : TComponent);

ved program start linker du så de enkelte konvert metoder til disse 2 procedurer.

//hvis f.eks. din main form hedder mainform
procedurer TMainForm.OnCreate(...
begin
OggToMp3.OnProgress:=OnProgress;
OggToMp3.OnDone:=OnDone;
ApeToMp3.OnProgress:=OnProgress;
ApeToMp3.OnDone:=OnDone;
WavToMp3.OnProgress:=OnProgress;
WavToMp3.OnDone:=OnDone;
.
.
end;

Sådan ville jeg gøre det.
Avatar billede psycosoft-funware Nybegynder
11. april 2006 - 21:37 #37
du er genial kroning :D... hvorfor kom jeg ikke på det... lave to standard procedure for alle processerne...

fordi det der skal ske er at i OnProgress skal den flytte progress baren for den nuværende status, og i onDone skal det kontrollere om alle filer er taget ellers tage næste fil i bunken og rykke progressbaren en tak for hver gang en fil bliver færdig... :D

jeg vil lige flække noget sammen, og så vender jeg tilbage... :D
Avatar billede psycosoft-funware Nybegynder
16. april 2006 - 17:40 #38
hej kroning :)

så lykkeds det, af en eller anden grund VILLE koden i onDone ikke afvikles ordenligt, nu bliver det hele afviklet i en timer komponent hvor intervallet bliver beregnet dynamisk ud fra hver fil individuelt.

jeg ville sætte stor pris på at du lægger et svar - skruer pointne op til 200 da du har givet mig så meget god input + du har hjulpet utroligt meget.

tusind tak :D


det færdige resultat kan ses her:
http://redsparkstudios.co.uk/spark_audio_converter.htm
Avatar billede kroning Nybegynder
16. april 2006 - 19:34 #39
Hvis jeg skal have points skal det vel kun være de points som du satte spørgsmålet til fra starten, det jeg har hjulpet uden for eksperten.dk tæller jo ikke, det mener jeg at kan mindes at der er i mod reglerne her på eksperten.dk :-)
Avatar billede psycosoft-funware Nybegynder
16. april 2006 - 19:38 #40
okay, det er bare i orden :), men jeg ville ellers gene have givet dig mere...
tusind tak for hjælpen :D
Avatar billede psycosoft-funware Nybegynder
16. april 2006 - 19:39 #41
inden jeg satte pointne op til 200, havde jeg sat spm til 80. (lige så der ikke hersker nogen tvivl) :)
Avatar billede kroning Nybegynder
16. april 2006 - 19:44 #42
Jeg ved heller ikke helt hvad de points skal bruges til ud over at kunne se sit navn på top 10 listen hvis man nogensinde kommer der op :-)
Avatar billede psycosoft-funware Nybegynder
16. april 2006 - 19:46 #43
det er så rigtigt nok... :)
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