10 de fev. de 2005

Delphi Ano X

Allen Bauer, o responsável pela IDE do Delphi, postou em seu blog uma nota sobre o aniversário de 10 anos do Delphi. Inclusive, tem uma foto do CD com a versão pré-release do Delphi. O lançamento oficial do Delphi foi em 14 de Fevereiro de 1995, no evento Software Development organizado pela revista de mesmo nome. Lembro que na época eu estava avaliando o Visual Basic e que meu primeiro contato com o Delphi foi através de um artigo da revista Microsoft Systems Journal (hoje MSDN Magazine) de junho de 1995. Depois de ler aquele artigo, abandonei o VB e providenciei a compra do Delphi para a empresa onde trabalhava na época.

3 de fev. de 2005

Como impedir a movimentação do form MDI filho?

Do fórum ClubeDelphi:

usando o código mostrado no post sobre ocultar as barras de rolagem em aplicativo MDI... tem como impedir a movimentação do form MDI filho para fora da área do MDI pai?

Pesquisei o NG da Borland e encontrei esta thread com o seguinte código:

1 type 2 TForm2 = class... 3 private 4 procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging); 5 message WM_WINDOWPOSCHANGING; 6 ... 7 8 procedure TForm2.WMWindowPosChanging(var Msg: TWMWindowPosChanging); 9 var 10 R: TRect; 11 begin 12 with Msg.WindowPos^ do begin 13 14 if (flags and SWP_NOMOVE) = 0 then begin 15 16 Windows.GetClientRect(Application.MainForm.ClientHandle, R); 17 18 if x < 0 then 19 x := 0; 20 21 if y < 0 then 22 y := 0; 23 24 if (x + cx) > R.Right then 25 x := R.Right - cx; 26 27 if (y + cy) > R.Bottom then 28 y := R.Bottom - cy; 29 end; 30 end; 31 32 inherited; 33 end;

Como ocultar as barras de rolagem em um aplicativo MDI?

No fórum ClubeDelphi apareceu esta rotina para ocultar as barras de rolagem de um form MDI pai:

1 type 2 TForm1 = class(TForm) 3 procedure FormCreate(Sender: TObject); 4 ... 5 6 implementation 7 8 ... 9 10 function ClientWindowProc(wnd: HWND; Msg: Cardinal; 11 wParam, lParam: Integer): Integer; stdcall; 12 var 13 f: Pointer; 14 begin 15 f := Pointer(GetWindowLong(wnd, GWL_USERDATA)); 16 17 case Msg of 18 WM_NCCALCSIZE: begin 19 20 if (GetWindowLong(wnd, GWL_STYLE) 21 and (WS_HSCROLL or WS_VSCROLL)) <> 0 then 22 23 SetWindowLong(wnd, GWL_STYLE, 24 GetWindowLong(wnd, GWL_STYLE) and 25 not (WS_HSCROLL or WS_VSCROLL)); 26 end; 27 end; 28 29 Result := 30 CallWindowProc(f, wnd, Msg, wparam, lparam); 31 end; 32 33 procedure TForm1.FormCreate(Sender: TObject); 34 begin 35 if ClientHandle <> 0 then begin 36 37 if (not (GetWindowLong(ClientHandle, 38 GWL_USERDATA) <> 0)) then begin 39 40 SetWindowLong(ClientHandle, GWL_USERDATA, 41 SetWindowLong(ClientHandle, GWL_WNDPROC, 42 Integer(@ClientWindowProc))); 43 end; 44 end; 45 46 // ... 47 end;

Como mostrar propriedades/eventos de forms personalizados no Object Inspector?

Do fórum ClubeDelphi:

... criei um form base para rotinas genéricas de cadastramento. O que eu preciso agora é definir algumas propriedades neste form base, que apareçam no Object Inspector, para que eu possa configurar algumas coisas. Porém não estou conseguindo isso. Já tentei criar uma propriedade na sessão published no form base, mas a propriedade não aparece nos forms herdeiros. ... como posso fazer isso?

Pesquisei o NG da Borland e encontrei esta thread que explica como fazer isso. Com base no que foi discutido lá:

  1. Inclua sua propriedade/evento personalizada na seção published do form.
  2. Adicione seu form personalizado ao Object Repository (clique com o botão direito no form e execute Add to repository)
  3. Inclua seu form personalizado em um design-time package (um bom candidato é o package dclusrXx, mas pode ser qualquer design time package)
  4. Inclua no fonte do package o seguinte:
    1 interface 2 ... 3 4 procedure Register; 5 6 implementation 7 8 uses 9 dsgnIntf; 10 // ou DesignIntf se D6+, inclua DesignIDE na 11 // seção requires do package 12 ... 13 14 procedure Register; 15 begin 16 // TMyForm é o form personalizado 17 RegisterCustomModule(TMyForm, TCustomModule); 18 end;
  5. Crie um form derivado do seu form personalizado

Limitações dos aplicativos Delphi no Windows 9x

Do fórum ClubeDelphi:

Aqui na empresa temos um sistema que atualmente está com 352 forms. O problema é que o programa roda no WinXP e Win2K, mas não roda em Win98. ... As mensagens [de erro] do Windows que aparecem [ao tentar executar o programa] são:
Impossivel executar C:\Programa\Programa.exe
e
Não há memória suficiente para iniciar C:\Programa\Programa.exe. Encerre alguns programas e tente novamente
Porém, se eu retirar dois forms ESPECÍFICOS o programa roda normalmente. Fazendo a depuração no Win98, nem chegar a executar a primeira linha do projeto. E, mais estranho ainda, é que se eu alterar o seu nome de um desses forms o programa roda; se eu voltar o nome original do form, não roda.

Pesquisei o NG da Borland e encontrei esta thread sobre esse problema; em particular, a mensagem 10 dessa thread explica porque mudar o nome do form resolve o problema.

Os pontos importantes dessa thread:

  • No Win98 existe um limite na quantidade e no tamanho total de forms contidos em um arquivo executável (mais precisamente, o limite se aplica aos recursos/resources nomeados contidos no executável). Esse limite não existe no WinNT/Win2K/WinXP.
  • A solução seria dividir o sistema em DLLs/BPLs e assim driblar o limite por arquivo imposto pelo Win98.

1 de fev. de 2005

Microsoft Ano XXX

Hoje completa 30 anos que a Microsoft, então uma empresa fundo de quintal formada pela dupla Gates/Allen, vendeu seu primeiro produto: um BASIC para o microcomputador Altair. Uma pequena história da Microsoft está aqui.