• R/O
  • SSH
  • HTTPS

mantisbtmonitor: Commit


Commit MetaInfo

Revision74 (tree)
Time2022-01-22 04:57:31
Authorderekwildstar

Log Message

Verificação de comentário vazio ao criar um backup de comentário
Trim aplicado na obtenção do nome do usuário e na ação obtidos a partir do histórico
Métodos Approve e Disapprove adicionados (ainda sem código)
Método Reject implementado e testado com sucesso
Em TFormBasicDialog foi sobrescrito o método CreateParams a fim de definir automaticamente o valor de WndParent
Criada uma versão sobrecarregada da função ShowMeModal em TFormManageNote de forma que a tela de edição de comentário possa aparecer para rejeições e impedimentos
Trim aplicado na obtenção de comentário em TFormManageNote
TFormTask.CreateParams ajustado corretamente

Change Summary

Incremental Difference

--- trunk/client/prj/MantisBTMonitor.dpr (revision 73)
+++ trunk/client/prj/MantisBTMonitor.dpr (revision 74)
@@ -71,7 +71,7 @@
7171 begin
7272 Configurations.UserInfo := UserInfo;
7373 Application.CreateForm(TFormSplash, FormSplash);
74- Application.Run;
74+ Application.Run;
7575 end;
7676 end;
7777 end.
--- trunk/client/prj/MantisBTMonitor.dproj (revision 73)
+++ trunk/client/prj/MantisBTMonitor.dproj (revision 74)
@@ -119,7 +119,7 @@
119119 <VerInfo_MinorVer>0</VerInfo_MinorVer>
120120 <VerInfo_Release>0</VerInfo_Release>
121121 <VerInfo_Locale>1033</VerInfo_Locale>
122- <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.600;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
122+ <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.626;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
123123 <Debugger_RunParams>/desenvolvimento</Debugger_RunParams>
124124 <VerInfo_AutoGenVersion>false</VerInfo_AutoGenVersion>
125125 <VerInfo_AutoIncVersion>true</VerInfo_AutoIncVersion>
@@ -126,7 +126,7 @@
126126 <DCC_DebugInformation>2</DCC_DebugInformation>
127127 <DCC_SymbolReferenceInfo>2</DCC_SymbolReferenceInfo>
128128 <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
129- <VerInfo_Build>600</VerInfo_Build>
129+ <VerInfo_Build>626</VerInfo_Build>
130130 <DCC_MapFile>3</DCC_MapFile>
131131 </PropertyGroup>
132132 <ItemGroup>
--- trunk/client/src/lib/UFunctions.pas (revision 73)
+++ trunk/client/src/lib/UFunctions.pas (revision 74)
@@ -24,7 +24,9 @@
2424 procedure CommentBackupDelete(ACommentId: Cardinal);
2525 function CommentBackupLoad(ACommentId: Cardinal): String;
2626 //: Adiciona o tag de cabeçalho de comentário de acordo com o id de unidade
27-//: configurado caso um ainda não exista
27+//: configurado caso um ainda não exista. Esta função NÃO ADICIONA os cabeçalhos
28+//: especiais de aprovação/reprovação de tarefas, apenas os cabeçalhos padrão de
29+//: comentários de acordo com a unidade do usuário
2830 procedure AddCommentHeader(var AComment: String);
2931 //: Retorna o comentário padrão de mudança de sitação de uma tarefa
3032 function GetDefaultStatusChangeText(const AStatus: String): String;
@@ -1138,6 +1140,9 @@
11381140
11391141 procedure CommentBackupCreate(ACommentId: Cardinal; AComment: String);
11401142 begin
1143+ if Trim(AComment) = '' then
1144+ Exit;
1145+
11411146 if not DirectoryExists(Configurations.TemporaryDirectory) then
11421147 CreateDir(Configurations.TemporaryDirectory);
11431148
@@ -1164,7 +1169,7 @@
11641169 // Apenas adiciona um cabeçalho de comentário se há a intenção de comentar
11651170 // algo, ou seja, se AComment <> ''. Quando se quer apenas adicionar anexos a
11661171 // uma tarefa isso é feito pelo mesmo script que se usa para adicionar
1167- // comentários, neste caso é possível criar um "comentário" vazio, desde que
1172+ // comentários, neste caso é possível criar um "comentário vazio", desde que
11681173 // haja ao menos um anexo. Nestas situações de "comentário de anexos", eu
11691174 // convencionei não incluir qualquer cabeçalho. Se no futuro esse comentário
11701175 // for essencial, basta remover a condição a seguir e executar seu bloco de
--- trunk/client/src/lib/UScrapFunctions.pas (revision 73)
+++ trunk/client/src/lib/UScrapFunctions.pas (revision 74)
@@ -1331,9 +1331,9 @@
13311331 HTMLElement := HTMLElementCollection.item(i,i) as IHTMLElement;
13321332
13331333 HistoryEntry.Moment := ExtractDateTime(((HTMLElement as IHTMLTableRow).cells.item(0,0) as IHTMLElement).innerText);
1334- HistoryEntry.User := ((HTMLElement as IHTMLTableRow).cells.item(1,1) as IHTMLElement).innerText;
1334+ HistoryEntry.User := Trim(((HTMLElement as IHTMLTableRow).cells.item(1,1) as IHTMLElement).innerText);
13351335 HistoryEntry.UserId := ParseUserId((FirstChildElement((HTMLElement as IHTMLTableRow).cells.item(1,1) as IHTMLElement) as IHTMLAnchorElement).href);
1336- HistoryEntry.Action := ((HTMLElement as IHTMLTableRow).cells.item(2,2) as IHTMLElement).innerText;
1336+ HistoryEntry.Action := Trim(((HTMLElement as IHTMLTableRow).cells.item(2,2) as IHTMLElement).innerText);
13371337 HistoryEntry.Data := ((HTMLElement as IHTMLTableRow).cells.item(3,3) as IHTMLElement).innerText;
13381338 // Nova forma de incrementar um array dinâmico (a partir do XE7)
13391339 ATask.History := ATask.History + [HistoryEntry];
@@ -1983,7 +1983,14 @@
19831983 Req.Content.Free;
19841984 end;
19851985 end;
1986-
1986+// Esta função retorna true caso a página carregada após a mudança de status
1987+// (que é a página da tarefa) contenha um elemento cuja classe é bug-status e
1988+// cuja outra classe desse mesmo elemento contenha o código do status que se
1989+// quer mudar. Não fiz nada para capturar um possível erro retornado pelo mantis
1990+// porque eu simplesmente não consegui gerar tal erro e não sei como ele
1991+// apareceria na tela para que eu possa parseá-lo, logo, a função ChangeStatus
1992+// só retornará true, mas caso retorne false eu não exibirei qualquer mensagem
1993+// de erro específica
19871994 function ParseChangeStatusResponse(ADocument: String; const ANewStatusId: Word): Boolean;
19881995 var
19891996 HTMLDocument: IHTMLDocument;
@@ -2038,8 +2045,11 @@
20382045
20392046 Req.Content := TMemoryStream.Create;
20402047 try
2041- // Adiciona o cabeçalho padrão de acordo com as configurações atuais, caso
2042- // já não exista um cabeçalho
2048+ // Adiciona o cabeçalho padrão de acordo com as configurações atuais de
2049+ // unidade, caso já não exista um cabeçalho. Um cabeçalho só vai existir
2050+ // neste ponto caso ele tenha sido incluído de forma manual em AComment.
2051+ // Isso deve acontecer apenas em mudanças de status de aprovação ou
2052+ // reprovação
20432053 AddCommentHeader(AComment);
20442054
20452055 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','bug_update_token',RawByteString(BugUpdateToken),BOUNDARY);
--- trunk/client/src/lib/UTypes.pas (revision 73)
+++ trunk/client/src/lib/UTypes.pas (revision 74)
@@ -430,15 +430,6 @@
430430
431431 { TTask }
432432
433-function TTask.GetExecutionsCount: Word;
434-begin
435- Result := 0;
436-
437- for var i: Cardinal := 0 to High(History) do
438- if (History[i].Action = HISTORY_ACTION_STATE) and (History[i].AsStatusChange.ToStatus.Id = Configurations.MantisConfigs.GetStatusByName(STATUS_IN_PROGRESS).Id) then
439- Inc(Result);
440-end;
441-
442433 procedure TTask.Clear(AAllButId: Boolean = True);
443434 var
444435 Id: Cardinal;
@@ -556,6 +547,15 @@
556547 Inc(Result);
557548 end;
558549
550+function TTask.GetExecutionsCount: Word;
551+begin
552+ Result := 0;
553+
554+ for var i: Cardinal := 0 to High(History) do
555+ if (History[i].Action = HISTORY_ACTION_STATE) and (History[i].AsStatusChange.ToStatus.Id = Configurations.MantisConfigs.GetStatusByName(STATUS_IN_PROGRESS).Id) then
556+ Inc(Result);
557+end;
558+
559559 function TTask.GetRelatedTasksCount: Word;
560560 begin
561561 Result := Length(FRelatedTasks);
--- trunk/client/src/UConfigurations.pas (revision 73)
+++ trunk/client/src/UConfigurations.pas (revision 74)
@@ -10,7 +10,9 @@
1010 TProfile = (pUnknown, pDeveloper, pTester, pHomologator);
1111 // Na enumeração abaixo eu não usei prefixos porque eu pretendo usar os nomes
1212 // dos elementos diretamente para obter os nomes dos tags especiais, a fim de
13- // economizar código
13+ // economizar código. Além disso o uso de prefixos caiu em desuso com a
14+ // possibilidade de se usar o nome do tipo como prefixo, como por exemplo,
15+ // TUnitId.une2 ou TUnitId.uds1, etc.
1416 TUnitId = (None, uds1, uds2, uds3, uds4, uds5, unts, une1, une2, une3, une4, une5, ungc);
1517
1618 TConfigurations = class(TRegistry)
@@ -52,6 +54,7 @@
5254 end;
5355
5456 const
57+ // Não incluir entre <p>...</p>. Apenas o texto puro
5558 STATUS_CHANGE_DEFAULT_COMMENT = 'Status: <b>%s</b>';
5659
5760 var
--- trunk/client/src/UDamoPrincipal.pas (revision 73)
+++ trunk/client/src/UDamoPrincipal.pas (revision 74)
@@ -293,6 +293,7 @@
293293 AddTask(MenuItem,Task.Id,Task.Project,Task.Status.Color);
294294 end;
295295 end;
296+
296297 // AObtainedTasks = Tarefas que foram obtidas no momento
297298 // ANewTasks = Apenas as tarefas que existem em AObtainedTasks e que não existem em FMyTasks
298299 procedure TDamoPrincipal.GetNewTasks(AObtainedTasks: TTasks; out ANewTasks: TTasks);
--- trunk/client/src/UDamoTask.pas (revision 73)
+++ trunk/client/src/UDamoTask.pas (revision 74)
@@ -75,7 +75,12 @@
7575 procedure Refresh;
7676 procedure ParseTaskIdAndCommentId(AUri: String; out ATaskId: Cardinal; out ACommentId: Cardinal);
7777 procedure Execute;
78+ //: Rejeita uma tarefa de forma genérica, isto é, pode ser usado por
79+ //: qualquer unidade a qualquer momento. Rejeições com carater de reprovação
80+ //: de tarefas sendo testadas são feitas por meio do método Disapprove
7881 procedure Reject;
82+ procedure Approve;
83+ procedure Disapprove;
7984
8085 property Task: TTask read FTask write FTask;
8186 end;
@@ -130,6 +135,11 @@
130135 UploadAttachments;
131136 end;
132137
138+procedure TDamoTask.Approve;
139+begin
140+ // implementar!
141+end;
142+
133143 procedure TDamoTask.CLDSAttachmentsFileSizeGetText(Sender: TField; var Text: string; DisplayText: Boolean);
134144 begin
135145 Text := FormatFloat('###,###,##0',Sender.AsFloat);
@@ -156,6 +166,11 @@
156166 Text := FormatDateTime('dd/mm/yyyy "às" hh:nn:ss',Sender.AsDateTime);
157167 end;
158168
169+procedure TDamoTask.Disapprove;
170+begin
171+ // Implementar!
172+end;
173+
159174 procedure TDamoTask.DownloadAttachment(AAttachmentId: Cardinal; AFileName: String; AOpen: Boolean);
160175 begin
161176 SADIAttachment.DefaultExt := Copy(ExtractFileExt(AFileName),2,MAX_PATH);
@@ -199,27 +214,52 @@
199214 procedure TDamoTask.Execute;
200215 begin
201216 // Colocar a tarefa em execução pode acontecer em dois momentos. A primeira
202- // execução seria a "primeira ver em que a tarefa foi posta em execução" e
217+ // execução seria a "primeira vez em que a tarefa foi posta em execução" e
203218 // todas as outras execuções subsequentes, por exemplo, quando se reinicia uma
204219 // tarefa que foi rejeitada. Por padrão colocamos o número da execução, assim
205- // é possível saber se está e a primeira execução ou uma execução posterior.
220+ // é possível saber se esta é a primeira execução ou uma execução posterior.
206221 // Todas as execuções tem um cabeçalho e um texto padrão. Eu resolvi
207222 // padronizar dessa forma
208- ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_IN_PROGRESS].Id,GetDefaultStatusChangeText(UpperCase(STATUS_IN_PROGRESS)) + ' (' + Succ(FTask.ExecutionsCount).ToString + ')');
223+ ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_IN_PROGRESS].Id,GetDefaultStatusChangeText(AnsiUpperCase(STATUS_IN_PROGRESS)) + ' (' + Succ(FTask.ExecutionsCount).ToString + ')');
209224
210225 Refresh;
211226 end;
212227
213228 procedure TDamoTask.Reject;
229+var
230+ Comment: String;
214231 begin
215-//abrir a tela de edição de comentário, como se fosse um comentário novo e ao confirmar o comentário, mudar o status
216-/// COLOCAR O TEXTO DE REJEIÇÃO ABAIXO DO TEXTO PADRÃO DE MUDANÇA DE STATUS, EM UM NOVO PARÁGRAFO
217-// COLOCAR UM HR ANTES DO TEXTO DE REJEIÇÃO. FAÇA O MESMO PARA O IMPEDIMENTO E TODOS OS OUTROS ESTADOS QUE PRECISEM DE UM TEXTO
218-// APENAS COLOCAR O HR SE HOUVER O TEXTO
232+// implemente a logica abaixo para impedimento e qqr outra mudança de status simples
233+// verifique como resolver o problema do botão na barra de tarefas sem usar o trick de CreateParams, pois ao usa-lo o form secundário exibido de forma modal é coberto por seu pai
234+ if TFormManageNote.ShowMeModal(Self.Owner,TSpecialMode.Reject,FTask.Id,Comment) = mrOk then
235+ begin
236+ CommentBackupCreate(0,Comment);
219237
238+ var DefaultText: String := '<p>' + GetDefaultStatusChangeText(UpperCase(STATUS_REJECTED)) + ' (' + Succ(FTask.RejectionsCount).ToString + ')</p>';
220239
221-// ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_REJECTED].Id,GetDefaultStatusChangeText(UpperCase(STATUS_REJECTED)) + ' (' + Succ(FTask.RejectionsCount).ToString + ')');
222- // Refresh
240+ // Caso o comentário não esteja em branco, adiciona um <hr> a fim de
241+ // separá-lo do texto padrão de mudança de status. Caso o comentário esteja
242+ // em branco, usa somente o texto padrão de mudança de status
243+ if Comment <> '' then
244+ Comment := DefaultText + '<hr>' + Comment
245+ else
246+ Comment := DefaultText;
247+
248+ if ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_REJECTED].Id,Comment) then
249+ begin
250+ CommentBackupDelete(0);
251+ Application.MessageBox('Tarefa rejeitada com sucesso!','Rejeição bem sucedida',MB_ICONINFORMATION);
252+ end
253+ else
254+ Application.MessageBox('Não foi possível rejeitar a tarefa. Tente novamente','Erro ao rejeitar a tarefa',MB_ICONERROR);
255+ // Acredito que um dos motivos pelos quais a rejeição possa falhar, seja
256+ // porque alguém possa ter mudado o status da tarefa antes de nós, fazendo
257+ // com que ela fique em um status que não permite uma rejeição (por exemplo,
258+ // se alguém rejeito a tarefa antes de nós). Neste caso, achei mais
259+ // coerente, sempre atualizar as informações, independentemente de ter
260+ // havido erro ou não
261+ Refresh;
262+ end;
223263 end;
224264
225265 procedure TDamoTask.NewComment;
--- trunk/client/src/UFormBasicDialog.pas (revision 73)
+++ trunk/client/src/UFormBasicDialog.pas (revision 74)
@@ -27,6 +27,7 @@
2727 { Private declarations }
2828 FAutoCaption: Boolean;
2929 protected
30+ procedure CreateParams(var Params: TCreateParams); override;
3031 procedure ValidateSave; virtual;
3132 procedure ValidateOk; virtual;
3233 public
@@ -53,6 +54,23 @@
5354 end;
5455 end;
5556
57+procedure TFormBasicDialog.CreateParams(var Params: TCreateParams);
58+begin
59+ inherited;
60+ // Fazendo isso, este form nunca será colocado atrás do form que o chamou de
61+ // forma modal! Excelente explicação aqui http://www.delphigroups.info/2/17/487031.html
62+ // Por padrão o WndParent é sempre o handle de Application, não importa o
63+ // Owner que se usou para criar o form atual. Não confundir Parent com Owner.
64+ // O Owner é o responsável por destruir o form e o Parent cria uma relação
65+ // hierárquica na ordem-Z aparentemente, por isso quando o Owner é TForm,
66+ // precisamos trocar params.WndParent de forma que ele corresponda ao handle
67+ // do Owner. Quando o Owner não é TForm, dentro da implementação atual, ele só
68+ // poderá ser Application e neste caso não há necessidade de trocar
69+ // params.WndParent pelo handle de seu Owner, porque este handle já vai ser o correto
70+ if Owner is TForm then
71+ params.WndParent := TForm(Owner).Handle;
72+end;
73+
5674 procedure TFormBasicDialog.FormClose(Sender: TObject; var Action: TCloseAction);
5775 begin
5876 Action := caFree;
--- trunk/client/src/UFormManageNote.pas (revision 73)
+++ trunk/client/src/UFormManageNote.pas (revision 74)
@@ -10,6 +10,8 @@
1010 UTypes, UDamoTask;
1111
1212 type
13+ TSpecialMode = (None,Reject,Impede);
14+
1315 TFormManageNote = class(TFormBasicDialog)
1416 PACO: TPageControl;
1517 TASHComment: TTabSheet;
@@ -40,6 +42,7 @@
4042 FUpdating: Boolean;
4143 FAttachmentsOnly: Boolean;
4244 FPostContent: TStringStream;
45+ FSpecialMode: TSpecialMode;
4346
4447 procedure DoDropFiles(ASender: TObject; const ADropHandle: LRESULT; out AMessageResult: LRESULT);
4548 procedure ConfigureCommentsPage;
@@ -49,7 +52,8 @@
4952 procedure ValidateSave; override;
5053 public
5154 { Public declarations }
52- class function ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult; reintroduce;
55+ class function ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult; reintroduce; overload;
56+ class function ShowMeModal(AOwner: TComponent; ASpecialMode: TSpecialMode; ATaskId: Cardinal; out AComment: String): TModalResult; reintroduce; overload;
5357 end;
5458
5559 implementation
@@ -114,8 +118,9 @@
114118 procedure TFormManageNote.ConfigureAttachmentsPage;
115119 begin
116120 // A aba de anexos só é visível se estamos no modo de inserção, ou no modo de
117- // edição quando há anexos associados ao comentário
118- TASHAttachments.TabVisible := (not FUpdating) or (FTask.CommentById[FCommentId].AttachmentsCount > 0);
121+ // edição quando há anexos associados ao comentário ou caso estejamos
122+ // executando algum modo especial
123+ TASHAttachments.TabVisible := ((not FUpdating) and (FSpecialMode = TSpecialMode.None)) or (FTask.CommentById[FCommentId].AttachmentsCount > 0);
119124 // Caso a aba de anexos esteja visível e estivermos no modo de edição,
120125 // precisamos carregar os anexos no ListView, que, neste caso, não aceitará
121126 // mais anexos, servido apenas para que possamos copiar referências a eles
@@ -280,6 +285,34 @@
280285 end;
281286 end;
282287
288+class function TFormManageNote.ShowMeModal(AOwner: TComponent; ASpecialMode: TSpecialMode; ATaskId: Cardinal; out AComment: String): TModalResult;
289+begin
290+ with Self.Create(AOwner) do
291+ begin
292+ AComment := '';
293+
294+ FComment := '';
295+ FSpecialMode := ASpecialMode;
296+ FUpdating := False;
297+
298+ AutoCaption := False;
299+
300+ Caption := 'Gerenciador de anotações - ' + Application.Title;
301+
302+ case ASpecialMode of
303+ TSpecialMode.Reject: LABECaption.Caption := 'Rejeitando a tarefa #' + ATaskId.ToString;
304+ TSpecialMode.Impede: LABECaption.Caption := 'Colocando em impedindo a tarefa #' + ATaskId.ToString;
305+ end;
306+
307+ // Caso exista um backup, pergunta se quer carregar.
308+ if CommentBackupExists(0) and (Application.MessageBox('Existe um backup do texto de um comentário que estava sendo redigido, deseja carregá-lo?','Deseja carregar o backup?',MB_ICONQUESTION or MB_YESNO) = IDYES) then
309+ FComment := CommentBackupLoad(0);
310+
311+ Result := ShowModal;
312+ AComment := FComment;
313+ end;
314+end;
315+
283316 class function TFormManageNote.ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult;
284317 begin
285318 Result := mrAbort; // Se tudo der errado...
@@ -293,6 +326,7 @@
293326 AUpdateToken := '';
294327
295328 FComment := '';
329+ FSpecialMode := TSpecialMode.None;
296330 FUpdating := FCommentId > 0;
297331 // O modo de edição tem precedência sobre o modo "apenas anexos". Caso
298332 // estejamos no modo de edição e AAttacmentshOnly seja true, isso configura
@@ -330,7 +364,7 @@
330364 begin
331365 FComment := CommentBackupLoad(FCommentId);
332366 Result := ShowModal;
333- AComment := FComment;
367+ AComment := Trim(FComment);
334368 end
335369 // Caso não existe um backup ou o usuário optou por não carregar um,
336370 // simplesmente abre o form com o comentário obtido do Mantis
@@ -337,7 +371,7 @@
337371 else
338372 begin
339373 Result := ShowModal;
340- AComment := FComment;
374+ AComment := Trim(FComment);
341375 end;
342376 end
343377 // Se não estamos tentando editar um comentário, entraremos no modo de
@@ -354,7 +388,7 @@
354388 // livrar deles ao final
355389
356390 Result := ShowModal;
357- AComment := FComment;
391+ AComment := Trim(FComment);
358392 AAttachments := FAttachments;
359393 end;
360394 end;
--- trunk/client/src/UFormTask.pas (revision 73)
+++ trunk/client/src/UFormTask.pas (revision 74)
@@ -190,11 +190,22 @@
190190 FDamoTask.Name := '_' + ATaskId.ToString;
191191 end;
192192
193+//resolvendo o problema de showmodal em forms secundários que tem botão na barra
194+// de tarefas
195+//http://www.delphigroups.info/2/17/487031.html
193196 procedure TFormTask.CreateParams(var Params: TCreateParams);
194197 begin
198+ // Em TFormBasicDialog há um método CreateParams sobrescrito que configura
199+ // Params.WndParent com o Handle do TForm ou TApplication que for o dono do
200+ // form sendo criado. Isso é o comportamento adequado para forms que abrem a
201+ // partir de instâncias do form atual. Já para estas últimas, Params.WndParent
202+ // precisa ser reconfigurado, como a seguir
195203 inherited;
196- Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
197-// Params.WndParent := 0;
204+ // A linha abaixo faz com que este form tenha um botão correspondente na barra
205+ // de tarefas, fazendo com que o desktop seja a janela pai deste form. Não
206+ // fazer isso, faz com que ao clicar em um dos botões da barra de tarefas,
207+ // todos os forms irmãos dentro da mesma aplicação sejam jogados para frente
208+ Params.WndParent := GetDesktopWindow;
198209 end;
199210
200211 procedure TFormTask.EDBRAdditionalInformationCreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HRESULT);
@@ -414,10 +425,12 @@
414425 {$WARN SYMBOL_PLATFORM OFF}
415426 if DebugHook > 0 then
416427 begin
417- var DatDirectory: String := ExpandFileName('..\res\dat\');
418- FDamoTask.CLDSHistory.SaveToFile(DatDirectory + 'history.cds');
419- FDamoTask.CLDSRelatedTasks.SaveToFile(DatDirectory + 'relatedtasks.cds');
420- FDamoTask.CLDSAttachments.SaveToFile(DatDirectory + 'attachments.cds');
428+// var DatDirectory: String := ExpandFileName('..\res\dat\');
429+// FDamoTask.CLDSHistory.SaveToFile(DatDirectory + 'history.cds');
430+// FDamoTask.CLDSRelatedTasks.SaveToFile(DatDirectory + 'relatedtasks.cds');
431+// FDamoTask.CLDSAttachments.SaveToFile(DatDirectory + 'attachments.cds');
432+
433+// FDamoTask.Task.ExecutionsCount;
421434 end;
422435 {$WARN SYMBOL_PLATFORM ON}
423436 end;
Show on old repository browser