• R/O
  • SSH
  • HTTPS

id3v2editorplus: Commit


Commit MetaInfo

Revision38 (tree)
Time2019-10-04 06:58:29
Authorderekwildstar

Log Message

UClassesAjudantes.pas

Removido record TImagem
Criado o método TextoANSI em TStreamHelper
Ajustados os métodos AtribuirImagens e ObterImagens

UClassesETipos.pas

Concluída a classe TAPIC para manipular uma lista de imagens

UDAMOPrincipal.pas

Ajustes para adequação com o novo TAPIC

Change Summary

Incremental Difference

--- trunk/V2/prj/ID3v2EditorPlus.dpr (revision 37)
+++ trunk/V2/prj/ID3v2EditorPlus.dpr (revision 38)
@@ -5,7 +5,7 @@
55 KRK.Lib.Vcl.Forms,
66 Vcl.Themes,
77 Vcl.Styles,
8- UFORMPrincipal in '..\src\UFORMPrincipal.pas' {FORMPrincipal: TFORMPrincipal},
8+ UFORMPrincipal in '..\src\UFORMPrincipal.pas' {FORMPrincipal: FORMPrincipal},
99 UDAMOPrincipal in '..\src\UDAMOPrincipal.pas' {DAMOPrincipal: TDataModule},
1010 bass in '..\src\lib\bass.pas',
1111 ID3v2Library in '..\src\lib\ID3v2Library.pas',
@@ -12,7 +12,6 @@
1212 ID3v1Library in '..\src\lib\ID3v1Library.pas',
1313 BufferedStream in '..\src\lib\BufferedStream.pas',
1414 UClassesAjudantes in '..\src\UClassesAjudantes.pas',
15- UClassesMediadoras in '..\src\UClassesMediadoras.pas',
1615 UBassUtils in '..\src\UBassUtils.pas',
1716 UFORMSobre in '..\src\UFORMSobre.pas' {FORMSobre},
1817 UClassesETipos in '..\src\UClassesETipos.pas';
--- trunk/V2/prj/ID3v2EditorPlus.dproj (revision 37)
+++ trunk/V2/prj/ID3v2EditorPlus.dproj (revision 38)
@@ -125,7 +125,6 @@
125125 <DCCReference Include="..\src\lib\ID3v1Library.pas"/>
126126 <DCCReference Include="..\src\lib\BufferedStream.pas"/>
127127 <DCCReference Include="..\src\UClassesAjudantes.pas"/>
128- <DCCReference Include="..\src\UClassesMediadoras.pas"/>
129128 <DCCReference Include="..\src\UBassUtils.pas"/>
130129 <DCCReference Include="..\src\UFORMSobre.pas">
131130 <Form>FORMSobre</Form>
--- trunk/V2/src/UClassesMediadoras.pas (revision 37)
+++ trunk/V2/src/UClassesMediadoras.pas (nonexistent)
@@ -1,316 +0,0 @@
1-unit UClassesMediadoras;
2-
3-interface
4-
5-uses
6- System.SysUtils, System.Classes, Vcl.ExtCtrls, Vcl.StdCtrls, UPngImageList,
7- Vcl.ActnList;
8-
9-type
10-// TPNGImageCollectionItem = class (UPngImageList.TPNGImageCollectionItem)
11-// private
12-// FDescricao: String;
13-// FTipoMime: String;
14-// FTipoDaImagem: Byte;
15-// public
16-// property Descricao: String read FDescricao write FDescricao;
17-// property TipoMime: String read FTipoMime write FTipoMime;
18-// property TipoDaImagem: Byte read FTipoDaImagem write FTipoDaImagem;
19-// end;
20-
21- TPNGImageCollection = class (UPngImageList.TPNGImageCollection)
22- private
23- FIndice: SmallInt;
24- FImagem: TImage;
25- FDescricao: TLabeledEdit;
26- FTipo: TComboBox;
27- FProximaImagem: TAction;
28- FImagemAnterior: TAction;
29- FSalvarImagem: TAction;
30- FRemoverImagem: TAction;
31- FSubstituirImagem: TAction;
32- FContador: TLabel;
33- FContadorSombra: TLabel;
34-
35- procedure AtualizarEstadoDosComponentesDeSaida;
36- public
37- constructor Create(AOwner: TComponent); override;
38- procedure ConfigurarComponentesDeSaida(AImagem: TImage; ADescricao: TLabeledEdit; ATipo: TComboBox; AProximaImagem: TAction; AImagemAnterior: TAction; ASalvarImagem: TAction; ARemoverImagem: TAction; ASubstituirImagem: TAction; AContador: TLabel; AContadorSombra: TLabel);
39- function ExcluirAtual: Boolean;
40-
41- function Exportar(AArquivo: TFileName): Boolean;
42- function Importar(AArquivo: TFileName; ANovoAPIC: Boolean): Boolean;
43- procedure Salvar(AArquivo: TFileName);
44- procedure Carregar(AArquivo: TFileName; ANovoAPIC: Boolean);
45-
46- procedure Limpar;
47- procedure ExibirImagem(AIndiceDaImagem: Word);
48- procedure ProximaImagem(AUltima: Boolean = False);
49- procedure ImagemAnterior(APrimeira: Boolean = False);
50- procedure ConfirmarInformacoesDaImagem;
51- end;
52-
53-implementation
54-
55-uses
56- Vcl.Forms, WinApi.Windows, UClassesAjudantes;
57-
58-{ TPNGImageCollectionItemsHelper }
59-
60-procedure TPNGImageCollection.Limpar;
61-begin
62-// Items.Clear;
63-// FIndice := -1;
64-//
65-// FImagem.Picture := nil;
66-// FDescricao.Clear;
67-// FTipo.ItemIndex := 0;
68-// FRemoverImagem.Enabled := False;
69-// FSalvarImagem.Enabled := False;
70-// FSubstituirImagem.Enabled := False;
71-// FProximaImagem.Enabled := False;
72-// FImagemAnterior.Enabled := False;
73-// FContador.Caption := '0 / 0';
74-// FContadorSombra.Caption := '0 / 0';
75-//
76-// AtualizarEstadoDosComponentesDeSaida;
77-end;
78-
79-procedure TPNGImageCollection.ProximaImagem(AUltima: Boolean = False);
80-begin
81-// if (Items.Count = 0) or (Succ(FIndice) = Items.Count) then
82-// Exit;
83-//
84-// // Salva no item da imagem atual suas informações
85-// ConfirmarInformacoesDaImagem;
86-//
87-// if AUltima then
88-// FIndice := Pred(Items.Count)
89-// else
90-// Inc(FIndice);
91-//
92-// ExibirImagem(FIndice);
93-end;
94-
95-function TPNGImageCollection.Exportar(AArquivo: TFileName): Boolean;
96-begin
97- Result := False;
98-
99- if (FIndice = -1) or (AArquivo = '') then
100- Exit;
101-
102- TPNGImageCollectionItem(Items[FIndice]).PngImage.SaveToFile(AArquivo);
103- Result := True;
104-end;
105-
106-procedure TPNGImageCollection.Salvar(AArquivo: TFileName);
107-begin
108- with TFileStream.Create(AArquivo,fmCreate or fmShareDenyWrite) do
109- try
110- // Cabeçalho do arquivo
111- Write(PAnsiChar('Iv2EP!APIC')^,10);
112-
113- // Descrição
114- //Write(PWideChar(TPNGImageCollectionItem(Items[FIndice]).FDescricao)^, (Length(TPNGImageCollectionItem(Items[FIndice]).FDescricao) + 1) * 2);
115-
116- // Tipo da imagem
117- //Write(TPNGImageCollectionItem(Items[FIndice]).FTipoDaImagem,1);
118-
119- // Texto da letraasdsd sad
120-// Write(PWideChar(Trim(Items[FIndice].Texto))^, (Length(Trim(Items[FIndice].Texto)) + 1) * 2);
121- finally
122- Free;
123- end;
124-end;
125-
126-procedure TPNGImageCollection.ImagemAnterior(APrimeira: Boolean = False);
127-begin
128- if (Items.Count = 0) or (FIndice = 0) then
129- Exit;
130-
131- // Salva no item da imagem atual suas informações
132- ConfirmarInformacoesDaImagem;
133-
134- if APrimeira then
135- FIndice := 0
136- else
137- Dec(FIndice);
138-
139- ExibirImagem(FIndice);
140-end;
141-
142-function TPNGImageCollection.Importar(AArquivo: TFileName; ANovoAPIC: Boolean): Boolean;
143-var
144- APIC: TPNGImageCollectionItem;
145-begin
146- if ANovoAPIC or (FIndice = -1) then
147- APIC := TPNGImageCollectionItem(Items.Add)
148- else
149- APIC := TPNGImageCollectionItem(Items[FIndice]);
150-
151- APIC.PngImage.LoadFromFile(AArquivo);
152- APIC.Name := ExtractFileName(AArquivo);
153-
154- if ANovoAPIC then
155- ProximaImagem(True)
156- else
157- ExibirImagem(FIndice);
158-
159- Result := True;
160-end;
161-
162-procedure TPNGImageCollection.AtualizarEstadoDosComponentesDeSaida;
163-begin
164-// FProximaImagem.Enabled := (Items.Count > 0) and (FIndice < Pred(Items.Count));
165-// FImagemAnterior.Enabled := (Items.Count > 0) and (FIndice > 0);
166-// FSalvarImagem.Enabled := Items.Count > 0;
167-// FRemoverImagem.Enabled := FSalvarImagem.Enabled;
168-// FSubstituirImagem.Enabled := FSalvarImagem.Enabled;
169-// FContador.Caption := Succ(FIndice).ToString + ' / ' + Items.Count.ToString;
170-// FContadorSombra.Caption := FContador.Caption;
171-// FDescricao.Enabled := FSalvarImagem.Enabled;
172-// FTipo.Enabled := FSalvarImagem.Enabled;
173-//
174-// if Items.Count = 0 then
175-// begin
176-// FImagem.Picture := nil;
177-// FDescricao.Text := '';
178-// FTipo.ItemIndex := 0;
179-// end;
180-end;
181-
182-procedure TPNGImageCollection.Carregar(AArquivo: TFileName; ANovoAPIC: Boolean);
183-var
184- ArquivoAPIC: TFileStream;
185- Header: PAnsiChar;
186- APIC: TPNGImageCollectionItem;
187-begin
188- ArquivoAPIC := TFileStream.Create(AArquivo,fmOpenRead or fmShareDenyWrite);
189- Header := AllocMem(10);
190-
191- try
192- if ANovoAPIC or (FIndice = -1) then
193- APIC := TPNGImageCollectionItem(Items.Add)
194- else
195- APIC := TPNGImageCollectionItem(Items[FIndice]);
196-
197- ArquivoAPIC.Read(Header^,10);
198-
199- if Header <> 'Iv2EP!APIC' then
200- raise Exception.Create('Arquivo APIC inválido');
201-
202- APIC.Name := ExtractFileName(AArquivo);
203- //APIC.Descricao := ArquivoAPIC.TextoUnicode;
204- //APIC.TipoMime := 'image/png';
205- //ArquivoAPIC.Read(APIC.FTipoDaImagem,1);
206-
207- var StreamDaImagem: TMemoryStream := TMemoryStream.Create;
208-
209- try
210- StreamDaImagem.CopyFrom(ArquivoAPIC,ArquivoAPIC.Size - ArquivoAPIC.Position);
211- APIC.PngImage.LoadFromStream(StreamDaImagem);
212- finally
213- StreamDaImagem.Free;
214- end;
215-
216- if ANovoAPIC then
217- ProximaImagem(True)
218- else
219- ExibirImagem(FIndice);
220- finally
221- FreeMem(Header);
222- ArquivoAPIC.Free;
223- end;
224-end;
225-
226-procedure TPNGImageCollection.ConfigurarComponentesDeSaida(AImagem: TImage; ADescricao: TLabeledEdit; ATipo: TComboBox; AProximaImagem: TAction; AImagemAnterior: TAction; ASalvarImagem: TAction; ARemoverImagem: TAction; ASubstituirImagem: TAction; AContador: TLabel; AContadorSombra: TLabel);
227-begin
228-// FImagem := AImagem;
229-// FDescricao := ADescricao;
230-// FTipo := ATipo;
231-// FProximaImagem := AProximaImagem;
232-// FImagemAnterior := AImagemAnterior;
233-// FSalvarImagem := ASalvarImagem;
234-// FRemoverImagem := ARemoverImagem;
235-// FSubstituirImagem := ASubstituirImagem;
236-// FContador := AContador;
237-// FContadorSombra := AContadorSombra;
238-end;
239-
240-procedure TPNGImageCollection.ConfirmarInformacoesDaImagem;
241-begin
242-// if (Items.Count = 0) or (FIndice = -1) then
243-// Exit;
244-//
245-// TPNGImageCollectionItem(Items[FIndice]).Descricao := 'xxx';//FDescricao.Text;
246-// TPNGImageCollectionItem(Items[FIndice]).TipoMime := 'xxxx';//'image/png';
247-// TPNGImageCollectionItem(Items[FIndice]).TipoDaImagem := 0;//FTipo.ItemIndex;
248-end;
249-
250-constructor TPNGImageCollection.Create(AOwner: TComponent);
251-begin
252- inherited;
253-// FIndice := -1;
254-end;
255-
256-function TPNGImageCollection.ExcluirAtual: Boolean;
257-begin
258- Result := False;
259-
260- if FIndice = -1 then
261- Exit;
262-
263- Result := Application.MessageBox('Deseja mesmo excluir esta imagem?','Tem certeza?',MB_ICONQUESTION or MB_YESNO) = IDYES;
264-
265- if not Result then
266- Exit;
267-
268- Items.Delete(FIndice);
269-
270- // Caso tenhamos excluído uma imagem que não tenha sido a última imagem da
271- // lista basta recarregar o índice atual. Isso vai, invariavelmente, carregar
272- // a imagem que estava após a imagem excluída
273- if FIndice < Items.Count then
274- ExibirImagem(FIndice)
275- // Caso contrário, se tivermos excluído a última imagem
276- else
277- begin
278- // Ajusta o indice da última imagem
279- Dec(FIndice);
280-
281- // Caso ainda existam imagens na lista, precisamos carregar a última imagem
282- if Items.Count > 0 then
283- ExibirImagem(FIndice)
284- // Por fim, se o fluxo chega aqui é porque a lista de imagens está vazia,
285- // neste caso apenas ajustamos a tela para refletir essa nova realidade
286- else
287- AtualizarEstadoDosComponentesDeSaida;
288- end;
289-end;
290-
291-procedure TPNGImageCollection.ExibirImagem(AIndiceDaImagem: Word);
292-begin
293-// if (not Assigned(FImagem)) or (Items.Count = 0) or (AIndiceDaImagem > Pred(Items.Count)) then
294-// Exit;
295-//
296-// FImagem.Picture.Assign(TPNGImageCollectionItem(Items[AIndiceDaImagem]).PngImage);
297-//
298-// var OnChangeOriginal: TNotifyEvent;
299-//
300-// OnChangeOriginal := FDescricao.OnChange;
301-// try
302-// FDescricao.OnChange := nil;
303-// FTipo.OnChange := nil;
304-//
305-//// FDescricao.Text := TPNGImageCollectionItem(Items[AIndiceDaImagem]).Descricao;
306-//// FTipo.ItemIndex := TPNGImageCollectionItem(Items[AIndiceDaImagem]).TipoDaImagem;
307-// finally
308-// FDescricao.OnChange := OnChangeOriginal;
309-// FTipo.OnChange := OnChangeOriginal
310-// end;
311-//
312-// FIndice := AIndiceDaImagem;
313-// AtualizarEstadoDosComponentesDeSaida;
314-end;
315-
316-end.
--- trunk/V2/src/UClassesAjudantes.pas (revision 37)
+++ trunk/V2/src/UClassesAjudantes.pas (revision 38)
@@ -3,7 +3,7 @@
33 interface
44
55 uses
6- Classes, ExtCtrls, ID3v2Library, UPngImageList, UClassesETipos, UClassesMediadoras;
6+ Classes, ExtCtrls, ID3v2Library, UClassesETipos;
77
88 type
99 TTimerHelper = class helper for TTimer
@@ -18,13 +18,6 @@
1818 Conteudo: String;
1919 end;
2020
21- TImagem = record
22- TipoMime: String;
23- TipoDeImagem: Integer;
24- Descricao: String;
25- Dados: TStream;
26- end;
27-
2821 TID3v2TagHelper = class helper for TID3v2Tag
2922 private
3023 procedure ExcluirTodosOsFrames(AFrameName: String);
@@ -67,8 +60,8 @@
6760 property Genero: string read GetGenero write SetGenero;
6861 property Comentarios: TComentarios read GetComentarios write SetComentarios;
6962
70- procedure ObterImagens(AListaDeImagens: TPNGImageCollection);
71- procedure AtribuirImagens(const AListaDeImagens: TPNGImageCollection);
63+ procedure ObterImagens(AAPIC: TAPIC);
64+ procedure AtribuirImagens(const AAPIC: TAPIC);
7265
7366 procedure ObterUSLT(AUSLT: TUSLT);
7467 procedure AtribuirUSLT(const AUSLT: TUSLT);
@@ -80,8 +73,10 @@
8073 TStreamHelper = class helper for TStream
8174 private
8275 function GetTextoUnicode: String;
76+ function GetTextoANSI: AnsiString;
8377 public
8478 property TextoUnicode: String read GetTextoUnicode;
79+ property TextoANSI: AnsiString read GetTextoANSI;
8580 end;
8681
8782 implementation
@@ -199,28 +194,28 @@
199194 DeleteFrame(i);
200195 end;
201196
202-procedure TID3v2TagHelper.AtribuirImagens(const AListaDeImagens: TPNGImageCollection);
197+procedure TID3v2TagHelper.AtribuirImagens(const AAPIC: TAPIC);
203198 var
204199 StreamDaImagem: TStream;
205200 begin
206201 ExcluirTodosOsFrames('APIC');
207202
208- if AListaDeImagens.Items.Count = 0 then
203+ if AAPIC.Count = 0 then
209204 Exit;
210205
211206 StreamDaImagem := TMemoryStream.Create;
212207 try
213208
214- for var PNGItem: TCollectionItem in AListaDeImagens.Items do
209+ for var APICItem: TCollectionItem in AAPIC do
215210 begin
216211 TMemoryStream(StreamDaImagem).Clear;
217212
218- TPngImageCollectionItem(PNGItem).PngImage.SaveToStream(StreamDaImagem);
213+ TAPICItem(APICItem).Imagem.SaveToStream(StreamDaImagem);
219214 SetUnicodeCoverPictureFromStream(AddFrame('APIC')
220- ,''{TPngImageCollectionItem(PNGItem).Descricao}
215+ ,TAPICItem(APICItem).Descricao
221216 ,StreamDaImagem
222- ,'image/png'{TPngImageCollectionItem(PNGItem).TipoMime}
223- ,0 {TPngImageCollectionItem(PNGItem).TipoDaImagem});
217+ ,String(TAPICItem(APICItem).TipoMime)
218+ ,TAPICItem(APICItem).TipoDaImagem);
224219 end;
225220 finally
226221 StreamDaImagem.Free;
@@ -287,7 +282,7 @@
287282 Result := inherited GetURL('WOAR');
288283 end;
289284
290-procedure TID3v2TagHelper.ObterImagens(AListaDeImagens: TPNGImageCollection);
285+procedure TID3v2TagHelper.ObterImagens(AAPIC: TAPIC);
291286 var
292287 IndiceDaPrimeiraImagem: SmallInt;
293288 StreamDaImagem: TStream;
@@ -308,13 +303,12 @@
308303 TMemoryStream(StreamDaImagem).Clear;
309304
310305 if GetUnicodeCoverPictureStream(i, StreamDaImagem, TMI, DES, TDI) then
311- with TPNGImageCollectionItem(AListaDeImagens.Items.Add) do
306+ with AAPIC.Add do
312307 begin
313- PngImage.LoadFromStream(StreamDaImagem);
314- Name := 'Imagem #' + i.ToString;
315-// Descricao := DES;
316-// TipoMime := TMI;
317-// TipoDaImagem := TDI;
308+ Imagem.LoadFromStream(StreamDaImagem);
309+ Descricao := DES;
310+ TipoMime := AnsiString(TMI);
311+ TipoDaImagem := TDI;
318312 end;
319313 end;
320314 end;
@@ -488,6 +482,20 @@
488482
489483 { TStreamHelper }
490484
485+function TStreamHelper.GetTextoANSI: AnsiString;
486+var
487+ Byte1: Byte;
488+begin
489+ Result := '';
490+
491+ if Position < Size then
492+ repeat
493+ Read(Byte1,1);
494+
495+ Result := Result + AnsiChar(Byte1);
496+ until (Byte1 = 0) or (Position = Size);
497+end;
498+
491499 function TStreamHelper.GetTextoUnicode: String;
492500 var
493501 Byte1: Byte;
--- trunk/V2/src/UClassesETipos.pas (revision 37)
+++ trunk/V2/src/UClassesETipos.pas (revision 38)
@@ -60,7 +60,7 @@
6060 // conteúdo da letra contida no arquivo
6161 procedure Carregar(AArquivo: TFileName; ANovoUSLT: Boolean);
6262 function Add: TUSLTItem; overload;
63- procedure Add(AIdioma: TLanguageID; ADescricao: String; ATexto: String); overload;
63+ //procedure Add(AIdioma: TLanguageID; ADescricao: String; ATexto: String); overload;
6464 procedure Anterior(APrimeira: Boolean = False);
6565 procedure ConfirmarInformacoesDaLetra;
6666
@@ -160,14 +160,15 @@
160160 private
161161 FImagem: TPicture;
162162 FDescricao: String;
163- FTipoMime: String;
163+ FTipoMime: AnsiString;
164164 FTipoDaImagem: Byte;
165165 public
166166 constructor Create(ACollection: TCollection); override;
167+ destructor Destroy; override;
167168
168169 property Imagem: TPicture read FImagem write FImagem;
169170 property Descricao: String read FDescricao write FDescricao;
170- property TipoMime: String read FTipoMime write FTipoMime;
171+ property TipoMime: AnsiString read FTipoMime write FTipoMime;
171172 property TipoDaImagem: Byte read FTipoDaImagem write FTipoDaImagem;
172173 end;
173174
@@ -195,14 +196,13 @@
195196
196197 procedure Limpar;
197198 procedure Proxima(AUltima: Boolean = False);
198-// function ExcluirAtual: Boolean;
199-// function ExportarTexto(AArquivo: TFileName): Boolean;
200-// function ImportarTexto(AArquivo: TFileName; ANovoUSLT: Boolean): Boolean;
201-// procedure Salvar(AArquivo: TFileName);
202-// procedure Carregar(AArquivo: TFileName; ANovoUSLT: Boolean);
203-// function Add: TUSLTItem; overload;
204-// procedure Add(AIdioma: TLanguageID; ADescricao: String; ATexto: String); overload;
205-// procedure Anterior(APrimeira: Boolean = False);
199+ function ExcluirAtual: Boolean;
200+ function ExportarImagem(AArquivo: TFileName): Boolean;
201+ function ImportarImagem(AArquivo: TFileName; ANovoAPIC: Boolean): Boolean;
202+ procedure Salvar(AArquivo: TFileName);
203+ procedure Carregar(AArquivo: TFileName; ANovoAPIC: Boolean);
204+ function Add: TAPICItem;
205+ procedure Anterior(APrimeira: Boolean = False);
206206 procedure ConfirmarInformacoes;
207207
208208 property Items[AIndex: Integer]: TAPICItem read GetItem write SetItem; default;
@@ -243,15 +243,15 @@
243243 ExibirLetra(FIndice);
244244 end;
245245
246-procedure TUSLT.Add(AIdioma: TLanguageID; ADescricao: String; ATexto: String);
247-begin
248- with Add do
249- begin
250- Idioma := AIdioma;
251- Descricao := ADescricao;
252- Texto := ATexto;
253- end;
254-end;
246+//procedure TUSLT.Add(AIdioma: TLanguageID; ADescricao: String; ATexto: String);
247+//begin
248+// with Add do
249+// begin
250+// Idioma := AIdioma;
251+// Descricao := ADescricao;
252+// Texto := ATexto;
253+// end;
254+//end;
255255
256256 constructor TUSLT.Create(AWebBrowser: TWebBrowser; ADescricao: TLabeledEdit; AIdioma: TComboBox; AProximaUSLT: TAction; AUSLTAnterior: TAction; ASalvarUSLT: TAction; ARemoverUSLT: TAction; ASubstituirUSLT: TAction; AExportarUSLT: TAction; AContador: TLabel; AContadorSombra: TLabel);
257257 begin
@@ -1066,8 +1066,35 @@
10661066 FTipoDaImagem := 0;
10671067 end;
10681068
1069+destructor TAPICItem.Destroy;
1070+begin
1071+ FImagem.Free;
1072+ inherited;
1073+end;
1074+
10691075 { TAPIC }
10701076
1077+function TAPIC.Add: TAPICItem;
1078+begin
1079+ Result := TAPICItem(inherited Add);
1080+end;
1081+
1082+procedure TAPIC.Anterior(APrimeira: Boolean);
1083+begin
1084+ if (Count = 0) or (FIndice = 0) then
1085+ Exit;
1086+
1087+ // Salva no item da letra atual suas informações
1088+ ConfirmarInformacoes;
1089+
1090+ if APrimeira then
1091+ FIndice := 0
1092+ else
1093+ Dec(FIndice);
1094+
1095+ Exibir(FIndice);
1096+end;
1097+
10711098 procedure TAPIC.AtualizarEstadoDosComponentesDeSaida;
10721099 begin
10731100 FProximaImagem.Enabled := (Count > 0) and (FIndice < Pred(Count));
@@ -1088,6 +1115,49 @@
10881115 end;
10891116 end;
10901117
1118+procedure TAPIC.Carregar(AArquivo: TFileName; ANovoAPIC: Boolean);
1119+var
1120+ ArquivoAPIC: TFileStream;
1121+ Header: PAnsiChar;
1122+ APIC: TAPICItem;
1123+begin
1124+ ArquivoAPIC := TFileStream.Create(AArquivo,fmOpenRead or fmShareDenyWrite);
1125+ Header := AllocMem(10);
1126+
1127+ try
1128+ if ANovoAPIC or (FIndice = -1) then
1129+ APIC := Add
1130+ else
1131+ APIC := Items[FIndice];
1132+
1133+ ArquivoAPIC.Read(Header^,10);
1134+
1135+ if Header <> 'Iv2EP!APIC' then
1136+ raise Exception.Create('Arquivo APIC inválido');
1137+
1138+ APIC.Descricao := ArquivoAPIC.TextoUnicode;
1139+ APIC.TipoMime := ArquivoAPIC.TextoANSI;
1140+ ArquivoAPIC.Read(APIC.FTipoDaImagem,1);
1141+
1142+ var StreamDaImagem: TMemoryStream := TMemoryStream.Create;
1143+
1144+ try
1145+ StreamDaImagem.CopyFrom(ArquivoAPIC,ArquivoAPIC.Size - ArquivoAPIC.Position);
1146+ APIC.Imagem.LoadFromStream(StreamDaImagem);
1147+ finally
1148+ StreamDaImagem.Free;
1149+ end;
1150+
1151+ if ANovoAPIC then
1152+ Proxima(True)
1153+ else
1154+ Exibir(FIndice);
1155+ finally
1156+ FreeMem(Header);
1157+ ArquivoAPIC.Free;
1158+ end;
1159+end;
1160+
10911161 procedure TAPIC.ConfirmarInformacoes;
10921162 begin
10931163 if (Count = 0) or (FIndice = -1) then
@@ -1100,6 +1170,8 @@
11001170
11011171 constructor TAPIC.Create(AImagem: TImage; ADescricao: TLabeledEdit; ATipo: TComboBox; AProximaImagem, AImagemAnterior, ASalvarImagem, ARemoverImagem, ASubstituirImagem: TAction; AContador, AContadorSombra: TLabel);
11021172 begin
1173+ inherited Create(TAPICItem);
1174+
11031175 FIndice := -1;
11041176 FImagem := AImagem;
11051177 FDescricao := ADescricao;
@@ -1113,6 +1185,33 @@
11131185 FContadorSombra := AContadorSombra;
11141186 end;
11151187
1188+function TAPIC.ExcluirAtual: Boolean;
1189+begin
1190+ Result := False;
1191+
1192+ if FIndice = -1 then
1193+ Exit;
1194+
1195+ Result := Application.MessageBox('Deseja mesmo excluir esta imagem?','Tem certeza?',MB_ICONQUESTION or MB_YESNO) = IDYES;
1196+
1197+ if not Result then
1198+ Exit;
1199+
1200+ Delete(FIndice);
1201+
1202+ if FIndice < Count then
1203+ Exibir(FIndice)
1204+ else
1205+ begin
1206+ Dec(FIndice);
1207+
1208+ if Count > 0 then
1209+ Exibir(FIndice)
1210+ else
1211+ Limpar;
1212+ end;
1213+end;
1214+
11161215 procedure TAPIC.Exibir(AIndice: Word);
11171216 begin
11181217 if (not Assigned(FImagem)) or (Count = 0) or (AIndice > Pred(Count)) then
@@ -1138,11 +1237,48 @@
11381237 AtualizarEstadoDosComponentesDeSaida;
11391238 end;
11401239
1240+function TAPIC.ExportarImagem(AArquivo: TFileName): Boolean;
1241+begin
1242+ Result := False;
1243+
1244+ if (FIndice = -1) or (AArquivo = '') then
1245+ Exit;
1246+
1247+ // No futuro, verifique o tipo mime para salvar corretamente
1248+ Items[FIndice].Imagem.SaveToFile(AArquivo);
1249+
1250+ Result := True;
1251+end;
1252+
11411253 function TAPIC.GetItem(AIndex: Integer): TAPICItem;
11421254 begin
11431255 Result := TAPICItem(inherited GetItem(AIndex));
11441256 end;
11451257
1258+function TAPIC.ImportarImagem(AArquivo: TFileName; ANovoAPIC: Boolean): Boolean;
1259+var
1260+ APIC: TAPICItem;
1261+begin
1262+ if ANovoAPIC or (FIndice = -1) then
1263+ begin
1264+ APIC := Add;
1265+ APIC.Descricao := ExtractFileName(AArquivo);
1266+ end
1267+ else
1268+ APIC := Items[FIndice];
1269+
1270+ APIC.TipoMime := 'image/png'; // no futuro detecte
1271+
1272+ APIC.Imagem.LoadFromFile(AArquivo);
1273+
1274+ if ANovoAPIC then
1275+ Proxima(True)
1276+ else
1277+ Exibir(FIndice);
1278+
1279+ Result := True;
1280+end;
1281+
11461282 procedure TAPIC.Limpar;
11471283 begin
11481284 Clear;
@@ -1178,11 +1314,39 @@
11781314 Exibir(FIndice);
11791315 end;
11801316
1317+procedure TAPIC.Salvar(AArquivo: TFileName);
1318+begin
1319+ with TFileStream.Create(AArquivo,fmCreate or fmShareDenyWrite) do
1320+ try
1321+ // Cabeçalho do arquivo
1322+ Write(PAnsiChar('Iv2EP!APIC')^,10);
1323+
1324+ // Descrição
1325+ Write(PWideChar(Items[FIndice].Descricao)^, (Length(Items[FIndice].Descricao) + 1) * 2);
1326+
1327+ // Tipo Mime
1328+ Write(PAnsiChar(Items[FIndice].TipoMime)^, Length(Items[FIndice].TipoMime) + 1); // + 1 seria o zero (null) finalizador
1329+
1330+ // Tipo da imagem
1331+ Write(Items[FIndice].TipoDaImagem,1);
1332+
1333+ var StreamDaImagem: TMemoryStream := TMemoryStream.Create;
1334+
1335+ try
1336+ Items[FIndice].Imagem.SaveToStream(StreamDaImagem);
1337+ StreamDaImagem.Position := 0;
1338+ Write(StreamDaImagem.Memory^,StreamDaImagem.Size);
1339+ finally
1340+ StreamDaImagem.Free;
1341+ end;
1342+ finally
1343+ Free;
1344+ end;
1345+end;
1346+
11811347 procedure TAPIC.SetItem(AIndex: Integer; const AValue: TAPICItem);
11821348 begin
11831349 inherited SetItem(AIndex, AValue);
11841350 end;
11851351
1186-continuar a implementação da classe APIC
1187-
11881352 end.
--- trunk/V2/src/UDAMOPrincipal.pas (revision 37)
+++ trunk/V2/src/UDAMOPrincipal.pas (revision 38)
@@ -6,9 +6,7 @@
66 System.SysUtils, System.Classes, Vcl.PlatformDefaultStyleActnCtrls,
77 System.Actions, Vcl.ActnList, Vcl.ActnMan, System.ImageList, Vcl.ImgList,
88 Vcl.Controls, UPngImageList, Vcl.ExtCtrls, Vcl.Dialogs, Vcl.Menus,
9- Vcl.ActnPopup, ID3v1Library, ID3v2Library, Vcl.ExtDlgs, UClassesETipos,
10- // Mantenha as units de classes mediadoras no final da cláusula uses
11- UClassesMediadoras;
9+ Vcl.ActnPopup, ID3v1Library, ID3v2Library, Vcl.ExtDlgs, UClassesETipos;
1210
1311 type
1412 TDAMOPrincipal = class(TDataModule)
@@ -30,7 +28,6 @@
3028 ACTNUltimaMusica: TAction;
3129 ACTNRemoverID3v1: TAction;
3230 ACTNSalvarID3v1: TAction;
33- PNICAPIC: TPngImageCollection;
3431 ACTNProximaImagem: TAction;
3532 ACTNImagemAnterior: TAction;
3633 ACTNSalvarImagemComo: TAction;
@@ -241,7 +238,7 @@
241238
242239 procedure TDAMOPrincipal.RemoverAPIC;
243240 begin
244- if PNICAPIC.ExcluirAtual then
241+ if FAPIC.ExcluirAtual then
245242 DefinirStatusDeModificado(cId3v2);
246243 end;
247244
@@ -280,7 +277,7 @@
280277 procedure TDAMOPrincipal.SalvarAPIC;
281278 begin
282279 if SADIAPIC.Execute then
283- PNICAPIC.Salvar(SADIAPIC.FileName);
280+ FAPIC.Salvar(SADIAPIC.FileName);
284281 end;
285282
286283 procedure TDAMOPrincipal.SalvarID3v1;
@@ -327,11 +324,11 @@
327324
328325 // Salva no item da imagem suas informações. Isso é necessário aqui porque o
329326 // item da imagem só é atualizado normalmente ao se navegar entre as imagens
330- PNICAPIC.ConfirmarInformacoesDaImagem;
327+ FAPIC.ConfirmarInformacoes;
331328
332329 // Transfere as imagens que estão na coleção de imagens para o objeto que
333330 // fará a persistência delas no arquivo
334- FID3v2Tag.AtribuirImagens(PNICAPIC);
331+ FID3v2Tag.AtribuirImagens(FAPIC);
335332
336333 { Letra da música }
337334
@@ -377,7 +374,7 @@
377374 begin
378375 if OPDIAPIC.Execute then
379376 begin
380- PNICAPIC.Carregar(OPDIAPIC.FileName,False);
377+ FAPIC.Carregar(OPDIAPIC.FileName,False);
381378 DefinirStatusDeModificado(cId3v2);
382379 end;
383380 end;
@@ -531,8 +528,8 @@
531528 CMBXIdiomaDoComentario.ItemIndex := CMBXIdiomaDoComentario.Items.IndexOf(LanguageIDtoString(Comentarios.Idioma));
532529 LAEDTipoDoComentario.Text := Comentarios.Tipo;
533530
534- FID3v2Tag.ObterImagens(PNICAPIC);
535- PNICAPIC.ImagemAnterior(True);
531+ FID3v2Tag.ObterImagens(FAPIC);
532+ FAPIC.Anterior(True);
536533
537534 FID3v2Tag.ObterUSLT(FUSLT);
538535 FUSLT.Anterior(True);
@@ -583,17 +580,6 @@
583580
584581 procedure TDAMOPrincipal.DataModuleCreate(Sender: TObject);
585582 begin
586-// PNICAPIC.ConfigurarComponentesDeSaida(TFORMPrincipal(Owner).IMAGAPIC
587-// ,TFORMPrincipal(Owner).LAEDDescricaoDaImagem
588-// ,TFORMPrincipal(Owner).CMBXTipoDaImagem
589-// ,ACTNProximaImagem
590-// ,ACTNImagemAnterior
591-// ,ACTNSalvarImagemComo
592-// ,ACTNRemoverImagem
593-// ,ACTNSubstituirImagem
594-// ,TFORMPrincipal(Owner).LABEImagens
595-// ,TFORMPrincipal(Owner).LABEImagensSombra);
596-
597583 FAPIC := TAPIC.Create(TFORMPrincipal(Owner).IMAGAPIC
598584 ,TFORMPrincipal(Owner).LAEDDescricaoDaImagem
599585 ,TFORMPrincipal(Owner).CMBXTipoDaImagem
@@ -651,6 +637,7 @@
651637 BASSFinalizar;
652638 FSYLT.Free;
653639 FUSLT.Free;
640+ FAPIC.Free;
654641 FID3v2Tag.Free;
655642 FID3v1Tag.Free;
656643 end;
@@ -676,7 +663,7 @@
676663
677664 procedure TDAMOPrincipal.ExportarImagemAPIC;
678665 begin
679- if SADIPNG.Execute and PNICAPIC.Exportar(SADIPNG.FileName) then
666+ if SADIPNG.Execute and FAPIC.ExportarImagem(SADIPNG.FileName) then
680667 Application.MessageBox('PNG da imagem atual exportado com sucesso!','Exportação concluída',MB_ICONINFORMATION);
681668 end;
682669
@@ -727,7 +714,7 @@
727714 LAEDTipoDoComentario.Clear;
728715 // Os métodos Limpar também limpam os campos da aplicação
729716 { Imagens }
730- PNICAPIC.Limpar;
717+ FAPIC.Limpar;
731718 { Letra da música }
732719 FUSLT.Limpar;
733720 { Letra sincronizada }
@@ -807,7 +794,7 @@
807794
808795 procedure TDAMOPrincipal.ACTNImagemAnteriorExecute(Sender: TObject);
809796 begin
810- PNICAPIC.ImagemAnterior;
797+ FAPIC.Anterior;
811798 end;
812799
813800 procedure TDAMOPrincipal.ACTNImportarPNGAPICExecute(Sender: TObject);
@@ -837,7 +824,7 @@
837824
838825 procedure TDAMOPrincipal.ACTNProximaImagemExecute(Sender: TObject);
839826 begin
840- PNICAPIC.ProximaImagem;
827+ FAPIC.Proxima;
841828 end;
842829
843830 procedure TDAMOPrincipal.ACTNProximaMusicaExecute(Sender: TObject);
@@ -961,7 +948,7 @@
961948 begin
962949 if OPDIAPIC.Execute then
963950 begin
964- PNICAPIC.Carregar(OPDIAPIC.FileName,True);
951+ FAPIC.Carregar(OPDIAPIC.FileName,True);
965952 DefinirStatusDeModificado(cId3v2);
966953 end;
967954 end;
Show on old repository browser