10. april 2006 - 08:50Der 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...? :-)
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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.
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... :)
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'
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:
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...? :)
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.
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 :)
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);
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.
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. :)
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 :)
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.
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... :)
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 :)
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. :)
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;
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
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.
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 :-)
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.