bonjour je cherche à inserer un fichier .pas ({$i fichier.pas} mais definie dans l'EDI Répertoire/Conditions->Destination
il est definit dans le fichier .cfg mais comment le mettre dans {$i (Répertoire Destination)/Fichier.pas
Merci.
Discussion :
bonjour je cherche à inserer un fichier .pas ({$i fichier.pas} mais definie dans l'EDI Répertoire/Conditions->Destination
il est definit dans le fichier .cfg mais comment le mettre dans {$i (Répertoire Destination)/Fichier.pas
Merci.
Je dirais quelque chose de cette façon :
{$I MonFichier.pas}
{$I ..\Common\MonFichier.pas}
{$I C:\Sources\Includes\MonFichier.pas}
On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:
pas vraiment ce que je cherche
donc un petit exemple
le fichier gateaux.pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 PROGRAM edi; {$AppType CONSOLE} uses windows, Classes, SysUtils; {$i Gateaux.pas} var selectfile:TStringlist; Cpi:Integer; T1:String; begin selectfile:=TStringlist.Create; T1:=' '; for cpi:=0 to high(gateaux) do begin selectfile.add(T1+''''+gateaux[Cpi]+''''); T1:=','; end; selectfile.sort; selectfile.Insert(0,'const gateaux:array[0 .. 30] of string=('); selectfile.add(');'); selectfile.SaveToFile('Gateaux.pas'); selectfile.free; writeln('Appuyez sur une touche'); readln; end.
cela fonctionne bien quand j'execute dans le répertoire courant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 const gateaux:array[0 .. 30] of string=( 'Le Paris-Brest' ,'La Brioche' ,'Les Chouquettes' ,'Le Chou' ,'LÉclair' ,'La Charlotte aux fraises' ,'Le Mille-feuille' ,'Les Madeleines' ,'Le Financier' ,'Le Pain Perdu' ,'La Tarte au citron meringuée' ,'La Religieuse' ,'Le Fondant au chocolat' ,'Le Macaron' ,'Les Cannelés' ,'LOpéra' ,'Le Fraisier' ,'Le Saint Honoré' ,'La Tarte tatin' ,'Le Baba au rhum' ,'Les Profiteroles' ,'Le Kouign-Amann' ,'Le quatre-quarts' ,'Les Beignets' ,'La Tropézienne' ,'Galette des Rois' ,'Clafoutis' ,'Gâteau Basque' ,'Napoléon' ,'Flan Pâtissier' ,'Merveilleux' );
maintenant quand je definit dans l'EDI le répertoire de déstination :
le fichier 'Gateaux.pas' est bien present dans le répetoire C:\Tmp mais le fichier {$i Gateaux.pas} n'a pas été modifié;
je sais je pourais faire {$i C:\Tmp\Gateaux.pas}
mais ce que je cherche est de connaitre soit le répertoire de destination de l'EDI ou bien le répertoire ou ce trouve la source du progamme (si je me suis bien fait comprendre).
ps:je sais que je pourai faire un Tstring.load(<fichier>') mais là n'est pas ma question. c'est de savoir comment recuperer le nom du répertoire de destination et pas avec un praramstr(0) mais bien de l'éditreur.
derniere chose je sais qu'un fois compilé le {$i gateaux.pas} sera inclut dans le .exe (et donc pas pris en compte) c'est juste pour me permettre de rajouter des lignes dans ma source. (les gateaux sont seulements des exemples) (et de faire un tri)
Pourquoi ne pas utiliser un fichier de ressources si ce n’est qu’une simple liste de données ?
Tu crées un fichier .rc, tu l’inclus dans ton exécutable, et tu charges ensuite ces données dans un tableau dynamique.
gateaux.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part GATEAUXTXT RCDATA "gateaux.txt"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Le Paris-Brest La Brioche Les Chouquettes Le Chou LÉclair La Charlotte aux fraises Le Mille-feuille Les Madeleines Le Financier Le Pain Perdu ...Tu gagnes en simplicité, en maintenabilité, et tu évites de toucher au code pour des données qui ne sont… que des données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 var Gateaux: array of string; procedure ChargerGateauxDepuisRessource; var ResStream: TResourceStream; SL: TStringList; I: Integer; begin SL := TStringList.Create; try // Charger la ressource RCDATA nommée "GATEAUXTXT" ResStream := TResourceStream.Create(HInstance, 'GATEAUXTXT', RT_RCDATA); try SL.LoadFromStream(ResStream); finally ResStream.Free; end; // Créer le tableau dynamique SetLength(Gateaux, SL.Count); // Copier les lignes dans le tableau dynamique for I := 0 to SL.Count - 1 do Gateaux[I] := SL[I]; finally SL.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin ChargerGateauxDepuisRessource; // Exemple d'utilisation ShowMessage('Premier gâteau : ' + Gateaux[0]); end;
On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:
Hello,
{$I Gateaux.pas} est traité lors de la compilation, alors que SaveToFile intervient à l’exécution. Le fichier généré ne pourra donc être inclus qu’à la compilation suivante.
La question est plutôt : souhaitez-vous générer du code avant la compilation, ou simplement modifier des données pendant l’exécution ?
Dans le premier cas, utilisez un générateur lancé avant le build. Dans le second, conservez les données dans un fichier externe. Le répertoire de destination défini dans l’EDI ne change pas cet ordre d’exécution.
EDIT : événements de pré-construction de RAD Studio
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Et si tu ajoutais C:\Tmp à Chemin de recherche![]()
je voudrais pouvoir mettre dans mon programme ZAlbum des podcasts (voir sources :Podcast.zip)
version simplifié de mon prog. :
dans le fichier Podcast.zip il faut rajouter les fichiers libeay32.dll et ssleay32.dll dans les rep. "Podcast\Fichiers ini" et "Podcast" (trop gros pour être mis dans le zip)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204 program envoie; {$AppType CONSOLE} uses WINDOWS, FORMS, Sysutils, CLASSES, IdHTTP, ActiveX, IdSSL, IdURI, IdComponent, WinInet, audiomeanxml, // voir plus bas IdSSLOpenSSL; type TForm1 = class(TForm) procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); procedure IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);{} // procedure FormCreate(Sender: TObject); private { private declarations } public { Public declarations } end; TYPE Las = RECORD Artist, // (%a) Nom de L'Artiste Album, // (%b) Titre de l'album Category, // (%g) Categorie de l'album Comment, // (%c) Commentaire Copyright, // (%k) Copyright LINK // (%w) LINK : STRING; Numtracks: INTEGER; // (%k) Nombre De Titres END; {Record} var SizeOfFile:Longint; //{$i .\podcast.pas} const audiomeans : array[0 .. 10] of string=( {00} 'https://feeds.audiomeans.fr/feed/c8088ac5-bb3e-42e5-889c-0cee1909b701.xml' // wave.audio - C'est plus compliqué que ça {01} ,'https://feeds.audiomeans.fr/feed/2634f188-47a0-48e1-b4ae-0ac360ed3ac3.xml' // Cherie FM France - Conte-moi l'aventure ! {03} ,'https://feeds.audiomeans.fr/feed/4cea9cc7-2a24-4ae6-b64b-2dd7407edcf5.xml' // NRJ France - Briller en société {03} ,'https://feeds.audiomeans.fr/feed/11116473-1837-44dd-b2f9-b01afb38f6f1.xml' // NRJ FRANCE - Erreur à la barre {04} ,'https://feeds.audiomeans.fr/feed/278c8c9f-2297-44cc-8674-65e285cb80c1.xml' // NRJ France - Feu de camp {05} ,'https://feeds.audiomeans.fr/feed/26b67f8a-cf3d-47aa-8763-c8653f26b785.xml' // Podcast Story - Podcast Story {06} ,'https://feeds.audiomeans.fr/feed/1e1146ca-6d5d-4a7c-a1a2-0735872d9b07.xml' // Radio Classique - Les grands dossiers de l'Histoire par Franck Ferrand {07} ,'' {08} ,'' {09} ,'' {10} ,'' ); destination='audiomeans.xml'; var Form1: TForm1; idHttp1 : TIdHTTP; IdSSL1:TIdSSLIOHandlerSocketOpenSSL;//assume on Form Cpi:integer; Titres : TSTRINGLIST; Laser_Mp3:Las; Dest,U1:String; audiomeansXml:IXMLRss; Channel:IXMLChannel; Items:IXMLItemList; procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin if (AWorkMode=wmRead) and (SizeOfFile<>0) then WRITE(inttostr(trunc(AWorkCount/SizeOfFile*100))+'% '+#13); end; procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin if AWorkMode = wmRead then // Uniquement quand le composant reçoit des données begin SizeOfFile := AWorkCountMax; // Maximum = taille de l'élément WRITE('0% '+#13); end; end; procedure TForm1.IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin WRITELN('100% '+#13); end; PROCEDURE BASE; BEGIN idHttp1 := TIdHTTP.Create(NIL); IdSSL1:=TIdSSLIOHandlerSocketOpenSSL.Create(NIL); WITH IdSSL1 DO BEGIN SSLOptions.Method := sslvTLSv1_2; SSLOptions.SSLVersions := [sslvTLSv1_2]; SSLOptions.Mode := sslmClient; SSLOptions.VerifyMode := []; SSLOptions.VerifyDepth := 0; PassThrough := false; END; WITH idHttp1 DO BEGIN HTTPOptions := HTTPOptions + [hoNoProtocolErrorException]; IOHandler := IdSSL1; AllowCookies := True; HandleRedirects := True; Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0'; Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; Request.AcceptLanguage := 'en-GB,en;q=0.5'; Request.Connection := 'keep-alive'; Request.ContentType := 'application/x-www-form-urlencoded'; END; END; FUNCTION DLFH(url,destination:STRING;P:Pointer=Nil): BOOLEAN; VAR stream:TMemoryStream; BEGIN result:=False; stream:=TMemoryStream.Create; try idHttp1.Get(url, stream); result:=IdHTTP1.ResponseCode=200; except on E: EIdHTTPProtocolException DO Result := False; on E: Exception DO Result := False; end; stream.Position := 0; if P=nil then begin stream.SaveToFile(destination); end else begin TStringlist(P).Clear; TStringlist(P).LoadFromStream(stream); end; stream.Free; END; FUNCTION downloadfilehttps(url:STRING;var selfile:TSTRINGLIST): BOOLEAN; overload; BEGIN idHttp1.OnWorkBegin := nil; idHttp1.OnWork := nil; idHttp1.OnWorkEnd := nil; result:=DLFH(url,'',selfile); sleep(500); END; FUNCTION downloadfilehttps(url,destination:STRING): BOOLEAN; overload; BEGIN idHttp1.OnWorkBegin := Form1.IdHTTP1WorkBegin; idHttp1.OnWork := Form1.IdHTTP1Work; idHttp1.OnWorkEnd := Form1.IdHTTPWorkEnd; result:=DLFH(url,destination); END; function AnsiToDOS(S: String): String; begin Result := S; UniqueString(Result); if S <> '' then begin CharToOemA(PAnsiChar(Result), PAnsiChar(Result)); end; end; BEGIN CoInitializeEx(nil, COINIT_APARTMENTTHREADED); Dest:=extractfilepath(paramstr(0)); BASE; Titres:=TSTRINGLIST.Create; U1:=' '; for cpi:=0 to high(audiomeans) do if audiomeans[cpi]<>'' THEN BEGIN Fillchar(Laser_Mp3,sizeof(Laser_Mp3),0); downloadfilehttps(audiomeans[cpi],Dest+destination); audiomeansXml:=Loadrss(Dest+destination); Channel:=audiomeansXml.Channel; Items:=Channel.Item; writeln(AnsiToDOS(Channel.Title)); Laser_Mp3.Artist:=trim(Channel.Author1); Laser_Mp3.Album:=trim(Channel.Title); Laser_Mp3.Numtracks:=Items.Count; Laser_Mp3.Copyright:=audiomeans[cpi]; Laser_Mp3.Category:='last Update: '+Channel.LastBuildDate; Laser_Mp3.Comment:=Channel.Link; Laser_Mp3.Numtracks:=Titres.count; Titres.Add(Laser_Mp3.Artist+' - '+Laser_Mp3.Album+'{'+format('%.2d',[Cpi])+'} '+U1+''''+Laser_Mp3.Copyright+''' // '+Laser_Mp3.Artist+' - '+Laser_Mp3.Album); U1:=','; END ELSE Titres.Add('Zzzzzzzzzzzzz{'+format('%.2d',[Cpi])+'} ,'''''); titres.sort; For cpi:=0 to pred(Titres.Count) do Titres[Cpi]:=copy(Titres[Cpi],pos('{',Titres[Cpi]),Maxint); Titres.Insert(0,'const audiomeans : array[0 .. '+inttostr(high(audiomeans))+'] of string=('); Titres.Add(');'); Titres.SaveToFile('Podcast.pas');(**) writeln('Appuyez sur une touche'); Titres.free; END.
le répertoire \audiomeans contient le fichier audiomeanxml.pas généré depuis : Audiomeanxml.xsd lui-même converti du fichier audiomeanxml.xml vers xsd
c'est pour ça que je cherche à connaitre le répertoire de déstination dans l'EDI (triage du fichier podcast.pas avec des commentaires)
si vous avez rajouter les fichiers libeay32.dll et ssleay32.dll comme indiqué il suffira de faire un click droit sur la zone des titres et de faire "mise à jour 'Fichiers ini\podcast.ini')"
J’ai du mal à comprendre le but de cette opération.
tu télécharge plusieurs flux RSS de podcasts Audiomeans, OK , en extrait les métadonnées (titre, auteur, lien, date…), puis tu génère automatiquement un fichier Podcast.pas
Pourquoi ne pas parser les XML directement depuis leur URL, ou les charger en mémoire depuis l’application ?
En générant un fichier Podcast.pas, tu verrouilles les données dans le code : toute mise à jour des flux RSS nécessite une recompilation, ce qui empêche l’application de refléter les nouveautés en temps réel.
Autre problème : si des épisodes sont supprimés du flux, ton application continue de les lister. En lisant les XML directement depuis leur URL ou en les chargeant en mémoire au lancement, tu garantis que les données reflètent toujours l’état réel du flux RSS.
Le fichier Podcast.pas rigidifie ton application : toute modification côté serveur (ajout, retrait, renommage) nécessite une recompilation pour être visible.
Je pense que l’approche basée sur la génération d’un fichier Podcast.pas n’est pas la meilleure solution, car elle rigidifie l’application et empêche toute mise à jour dynamique des flux.
Ton application dépend d’une connexion Internet et d’un serveur distant : dans ce cas, autant travailler directement avec ce serveur et récupérer les données en temps réel.
En revanche, si ton application doit fonctionner hors‑ligne et que tu télécharges les fichiers audio à l’avance, alors intégrer les métadonnées dans le programme peut se justifier.
On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:
@ZonZorg,
Si je comprends bien votre nouveau code, vous générez toujours Podcast.pas pendant l’exécution avec SaveToFile. Il est donc trop tard pour que cette version soit incluse dans l’exécutable déjà compilé.
Il faut séparer cette génération du programme principal :
Créer un petit exécutable générateur, puis l’appeler dans les événements de pré-construction de RAD Studio.
Le déroulement sera alors :
génération de Podcast.pas, puis compilation du projet qui l’inclut.
Si vous souhaitez que la mise à jour soit immédiatement visible sans recompilation, les URL ne doivent pas être placées dans un fichier source inclus avec {$I Podcast.pas}. Conservez-les dans votre fichier INI et chargez-les à l’exécution.
Je vous avais déjà indiqué le mécanisme dans mon précédent message -> événements de pré-construction de RAD Studio.
Il faut appeler un programme générateur à cette étape, afin que Podcast.pas soit créé avant sa compilation, et non depuis l’exécutable déjà compilé.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
La pré-construction n'existait pas en D7.
Effectivement, mais où était-il indiqué qu’il s’agissait de D7 ? La capture montre une ancienne version de l’EDI et le .cfg va dans ce sens, mais rien ne permettait, à ma connaissance, d’identifier précisément Delphi 7 ou ai-je mal lu ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Cette page d'options ne me rappelle rien, c'est du très vieux. Et sans thème activé (sans manifest), c'est du très très vieux![]()
D’accord, l’apparence permettait effectivement de soupçonner une très ancienne version. Cela dit, pour une question portant précisément sur les fonctionnalités de l’EDI, indiquer dès le départ la version de Delphi aurait évité cette ambiguïté. Une capture et la présence d’un .cfg ne permettent pas nécessairement d’identifier la version exacte.
Ça serait bien que le PO nous informe précisément...
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
je peux vous confirmer que c'est bien en delphi D7.
j'ai testé d'autre version mais l'egonomie ne me plaisait pas, et puis pour ce que j'en fais celà m'est largement suffisant.
je programme "à la papa" et cela me va.
merci à vous d'avoir porté attention à cette discussion.
et donc ma solution à été de travailler directement ma source dans le répertoire de destination.
le {$i ...} est bien modifié dès que j'y ajoute un .xml
Partager