Eu estive por algum tempo lançando versões experimentais do GExperts que incluem o formatador de código anteriormente conhecido como DelForEx com algumas melhorias e correções. A última versão é de 2008-12-26 e suporta as seguintes versões do Delphi: Delphi 6 a 7 Delphi 2005 a 2010 Delphi XE Delphi XE2 a XE7 Por favor, note que eu estou usando apenas com o Delphi 2007, então as outras versões pode ter erros desconhecidos. Além disso, nem todas as melhorias de idioma das versões posteriores do Delphi funcionarão, por exemplo, tipos aninhados, genéricos e métodos anônimos. btw: Qualquer ajuda para melhorar o formatador, especialmente adicionando as novas construções de linguagem seria apreciada. O código-fonte pode ser baixado do repositório subversion vinculado da minha página inicial. A versão TWM do GExperts funciona bem e está bem integrada ao IDE. Ele permite que você escreva e modifique seu código sem se preocupar muito com a formatação exata, em seguida, basta pressionar a tecla de atalho atribuída e reformatar instantaneamente. Eu sempre achei fácil de configurar para combinar com o estilo que eu prefiro, e não tão complexo como JEDI Code Format, que parecia um exagero para mim. A versão Delphi 2009 está agora disponível no link postado acima, embora baseado em uma versão beta do GExperts. Ainda é muito o mesmo formatador subjacente, e não tem conhecimento da sintaxe de alguns dos aprimoramentos mais recentes do Delphi. respondeu Dec 31 08 às 12: 19Como herdar formulários Insira o seguinte no evento OnCreate da forma descendente: procedure TForm1.FormCreate (Sender: TObject) var 160160DummyForm: TForm0 160160f: inteiro 160160tempComp: TComponent begin 160160try 160160160160DummyForm: TForm0.Create ( aplicação) 160160160160for f: DummyFormponentCount - 1 downto 0 fazer 160160160160begin 160160160160160160 160160160160160160tempComp: FindComponent (DummyFormponentsf. Name) não 160160160160160160if Assigned (tempComp), então 160160160160160160begin 160160160160160160160160 160160160160160160160160tempComp: DummyFormponentsf 160160160160160160160160DummyForm. RemoveComponent (tempComp) 160160160160160160160160InsertComponent (tempComp) 160160160160160160160160if tempComp é TControl então 160160160160160160160160160160with tempComp como TControl do 160160160160160160160160160160160160if Parent DummyForm, em seguida, 160160160160160160160160160160160160160160Parente: Auto 160160160160160160end 160160160160end 16016016016 0 160160160160 - - - gt 160160160160160160160160160160160160160160160160 o arquivo dfm para o formulário descendente. Fechando e, em seguida, abrindo a unidade de formulário 160160160160160160160160160160160160160160160160will permitirá que você edite os componentes herdados visualmente 160160finally 160160160160DummyForm. Free 160160end fim onde TForm0 é o formulário ancestral. Se você desejar substituir um número de propriedades para qualquer componente, recorte e cole o componente no arquivo dfm. Isso permitirá que você edite visualmente. 2010. janur 30. szombat Existe uma maneira de obter uma altura e largura de Jpegs sem usar TJPEGImage Eu tenho mais de 10.000 imagens que devem ser verificadas a cada mês e usando TJPEGImage. LoadFromFile para obter a altura e largura é muito lenta. Isso pode não funcionar com todos os tipos de. jpg imagens: função GetJpegSize (const FileName: string): var 160160fs TINT: 160300SegmentPos TFileStream: inteiro 160160SOIcount: 160160x inteiro, y: 160160b palavra: byte iniciar 160160fs: TFileStream. Create (FileName, fmOpenRead ou fmShareDenyNone) 160160try 160160160160fs. Position: 0 160160160160fs. Lead (x, 2) 160160160160if x ltgt D8FF então 160160160160160160raise Exception. Create (Não é um arquivo Jpeg) 160160160160Conta: 0 160160160160fs. Posição: 0 160160160160 while fs. Position 7 lt fs. Tamanho do 160160160160begin 160160160160160160fs. Read (b, 1) 160160160160160160if b FF então 160160160160160160begin 160160160160160160160160fs. Read (b, 1) 160160160160160160160160if b D8 então 160160160160160160160160160160Inc (SOIcount) 160160160160160160160160if b DA então 160160160160160160160160160160Break 160160160160160160end 160160160160end 160160160160if b ltgt DA então 160160160160160160raise Exception. Create (ficheiro JPEG corrompido ) 160160160160SegmentPos: -1 16 0160160160fs. Position: 0 160160160160while fs. Position 7 lt fs. Size que 160160160160begin 160160160160160160fs. Read (b, 1) 160160160160160160if b FF então 160160160160160160begin 160160160160160160160160fs. Read (b, 1) 160160160160160160160160if b em C0, C1, C2, em seguida, 160160160160160160160160begin 160160160160160160160160160160SegmentPos: fs. Position 160160160160160160160160160160Dec (SOIcount) 160160160160160160160160160160if SOIcount 0, em seguida, 160160160160160160160160160160160160Break 160160160160160160160160end 160160160160160160end 160160160160end 160160160160if SegmentPos -1 então 160160160160160160raise Exception. Create (ficheiro JPEG corrompido) 160160160160if fs. Position 7 gt fs. Size então 160160160160160160raise Exception. Create (ficheiro JPEG corrompido) 160160160160fs. Position : SegmentoPos 3 160160160160fs. Leia (y, 2) 160160160160fs. Leia (x, 2) 160160160160Resultado: Ponto (Trocar (x), Trocar (y)) 160160finally 160160160160fs. Free 160160dir fim de 2010. janur 29. pntek Como converter um ADO Recordset para um XML d a maneira reversa usa 160160Classes, função ADOInt RecordsetToXML (const Recordset: Recordset): função string RecordsetFromXML (const XML: string): Função Recordset RecordsetToXML (const Recordset: Recordset): string var 160160RS: Variante 160160Stream: TStringStream begin 160160Resultados: 160160if Recordset nil então 160160160160Exit 160160Stream: TStringStream. Create () 160160try 160160160160RS: CreateOleObject (ADODB. Recordset) 160160160160RS: Recordset 160160160160RS. Save (TStreamAdapter. Create (fluxo) como IUnknown, adPersistXML) 160160160160Stream. Position: 0 160160160160Resultado: Stream. DataString 160160finally 160160160160Stream. Livre 160160por fim função RecordsetFromXML (const XML: string): Recordset var 160160RS: variante 160160Stream: TStringStream iniciar 160160Resultados: nulo 160160if XML, em seguida 160160160160Exit 160160try 160160160160Stream: TStringStream. Create (XML) 160160160160Stream. Position: 0 160160160160RS: CreateOleObject (ADODB. Recordset) 160160160160RS. Abra (TStreamAd apter. Create (Stream) como IUnknown) 160160160160Resultado: IUnknown (RS) como Recordset 160160finally 160160160160Stream. Free 160160end final de 2010. janur 28. cstrtk Lidar com Font, bgColor, Alignment. (// função ColorToHtml (mColor: TColor): função string StrToHtml (mStr: string mFont: TFont nil): string //) função ColorToHtml (mColor: TColor): string começar 160160mColor: ColorToRGB (mColor) 160160Resultado: Formato (.2x .2x.2x, 160160160160GetRValue (mColor), GetGValue (mColor), GetBValue (mColor)) função final StrToHtml (mStr: string mFont: TFont nil): string var 160160vLeft, vRight: string begin 160160Resultado: mStr 160160Resultado: StringReplace (Resultado, amp, ampAMP, rfReplaceAll) 160160Resultado: StringReplace (Result, lt, ampLT, rfReplaceAll) 160160Resultado: StringReplace (Resultado, gt, ampGT, rfReplaceAll) 160160se não Atribuído (mFont), em seguida 160160160160Sair 160160vLeft: Formato (CORES DEFACTO DEFINIÇÃO, 160160160160mNomeFonte, ColorToHtml (mFont. Color) 160160vRight: 160160if fsBold em mFont. Style então 160160begin 160160160160vLeft: vLeft ltBgt 160160160160vRight: lt / Bgt vRight 160160end 160160if fsItalic em mFont. Style então 160160begin 160160160160vLeft: vLeft ltIgt 160160160160 vRight: Lt / lgt vRight 160160end 160160if fsUnderline em mFont. Style então 160160begin 160160160160vLeft: vLeft ltUgt 160160160160vRight: Lt / UGT vRight 160160end 160160if fsStrikeOut em mFont. Style então 160160begin 160160160160vLeft: vLeft ltSgt 160160160160vRight: Lt / Sgt vRight 160160end 160160Result: vLeft Resultado vRight Função final DBGridToHtmlTable (mDBGrid: TDBGrid mStrings: TStrings 160160mCapção: TCaption): Const Booleana 160160cAlignText: arrayTAlignment da cadeia (LEFT, RIGHT, CENTER) var 160160vColFormat: string 160160vColText: string 160160vAllWidth: Inteiro 160160vWidths: matriz do Integer 160160vBookmark: string 160160I, J : Inteiro começa 160160Resultado: Falso 160160se não Atribuído (mStrings) depois 160160160160Sair 160160se não Atribuído (mDBGrid) depois 160160160160Sair 160160se não Atribuído (mDBGrid. DataSource) depois 160160160160Sair 160160se não Atribuído (mDBGrid. DataSource. DataSet) depois 160160160160Sair 160160if não mDBGrid. DataSource. DataSet. Active, em seguida, 160160160160E Sair 160160vBookmark: mDBGrid. DataSource. DataSet. Bookmark 160160mDBGrid. DataSource. DataSet. DisableControls 160160try 160160160160J: 0 160160160160vAllWidth: 0 160160160160for I: 0 a mDBGrid. Columns. Count - 1 fazê 160160160160160160if mDBGrid. ColumnsI. Visible então 160160160160160160begin 160160160160160160160160Inc (J) 160160160160160160160160SetLength (vWidths, j) 160160160160160160160160vWidthsJ - 1: mDBGrid. ColumnsI. Width 160160160160160160160160Inc (vAllWidth, mDBGrid. ColumnsI. Width) 160160160160160160end 160160160160if J lt 0, em seguida, 160160160160160160Exit 160160160160mStrings. Clear 160160160160mStrings. Add (Formato (ltTABLE BGCOLORs BORDER1 WIDTH100gt, 160160160160160160ColorToHtml (mDBGrid. Color ))) 160160160160if mCaption ltgt então 160160160160160160mStrings. Add (Formato (ltCAPTIONgtslt / CAPTIONgt, StrToHtml (mCaption))) 160160160160vColFormat: 160160160160vColText: 160160160160vColFormat: vColFormat ltTRgt1310 160160160160vColText: vColText ltTRgt1310 160160160160J: 0 160160160160 para I: 0 a mDBGrid. Columns. Count - 1 fazê 160160160160160160if mDBGrid. ColumnsI. Visible então 160160160160160160begin 160160160160160160160160vColFormat: Formato vColFormat (160160160160160160160160160160160160ltTD BGCOLORs alinha WIDTHdgtDisplayTextdlt / TDgt1310, 160160160160160160160160160160ColorToHtml (mDBGrid. ColumnsI. Color), 160160160160160160160160160160cAlignTextmDBGrid. ColumnsI. Alignment, 160160160160160160160160160160160160Round ( vWidthsJ / vAllWidth 100), J) 160160160160160160160160vColText: Formato vColText (160160160160160160160160160160160160ltTD BGCOLORs alinha WIDTHdgtslt / TDgt1310, 160160160160160160160160160160ColorToHtml (mDBGrid. ColumnsI. Title. Color), 160160160160160160160160160160cAlignTextmDBGrid. ColumnsI. Alignment, 160160160160160160160160160160160160Round (vWidthsJ / vAllWidth 100), 160160160160160160160160160160160160StrToHtml (mDBGrid. ColumnsI. Title. Caption, 160160160160160160160160160160160160mDBGrid. ColumnsI. Title. Font)) 160160160160160160160160Inc (J) 1601601601 60160160end 160160160160vColFormat: vColFormat lt / TRgt1310 160160160160vColText: vColText lt / TRgt1310 160160160160mStrings. Text: mStrings. Text vColText 160160160160mDBGrid. DataSource. DataSet. First 160160160160while não mDBGrid. DataSource. DataSet. Eof fazer 160160160160begin 160160160160160160J: 0 160160160160160160vColText: vColFormat 160160160160160160for I: 0 a mDBGrid. Columns. Count - 1 fazê 160160160160160160160160if mDBGrid. ColumnsI. Visible então 160160160160160160160160begin 160160160160160160160160160160vColText: StringReplace (vColText, Format (gtDisplayTextdlt, J), 160160160160160160160160160160160160Format (gtslt, StrToHtml (mDBGrid. ColumnsI. Field. DisplayText, 160160160160160160160160160160160160160160mDBGrid. ColumnsI. Font)) , 160160160160160160160160160160160160rfReplaceAll) 160160160160160160160160160160Inc (J) 160160160160160160160160end 160160160160160160mStrings. Text: mStrings. Text vColText 160160160160160160mDBGrid. DataSource. DataSet. Next 160160160160end 160160160160mStr ings. Add (lt / TABLEgt) 160160finally 160160160160mDBGrid. DataSource. DataSet. Bookmark: vBookmark 160160160160mDBGrid. DataSource. DataSet. EnableControls 160160160160vWidths: nil 160160end 160160Resultado: Final verdadeiro /////// Procedimento de Origem Final TForm1.Button1Click (Remetente: TObject ) 160160DBGridToHtmlTable (DBGrid1, Memo1.Lines, Caption) 160160Memo1.Lines. SaveToFile (c: temp. htm) 160160ShellExecute (identificador, nulo, c: temp. htm, nulo, nulo, SWSHOW) end /////// End Demo 2010. janur 27. szerda Eu preciso inverter a ordem de bytes de vários valores inteiros para uma aplicação. Qual seria a melhor maneira de fazer essa troca big-endian / little-endian? Nota: Eu preciso converter valores de todos os tamanhos (word. Int64). função EndianWord (w: palavra): palavra começar 160160result: swap (w) end função EndianInt (i: integer): integer begin 160160result: swap (i) end função EndianLong (L: longint): longint começar 160160result: swap (L shr 16) ou (longint (swap (L e FFFF)) shl 16) end Pode-se usar a função Swap, mas o problema é que ela troca somente palavras ou inteiros. Eu escrevi a seguinte função para trocar qualquer coisa: procedimento SwapBytes (var Bytes Len: Integer) var 160160 Trocado: PChar 160160i: Integer começar 160160GetMem (Trocado, Len) 160160try 160160160160para i: 0 para Len - 1 do 160160160160160160SwappedLen - i - 1: PChar (Bytes ) i 160160160160Move (Swapped, Bytes, Len) 160160finally 160160160160FreeMem (Trocado) 160160end final tipo 160160TData1 palavra 160160TData2 palavra 160160TData4 cardeal 160160TData8 duplo 160160PData2 TData2 função Swap2 (a: cardinal): palavra função Swap4 (a: cardinal): função cardinal Swap2Signed (a : cardinal): função smallint Swap4Signed (a: cardinal): procedimento longint Procedimento Swap4Array (a, b: ponteiro n: inteiro) Procedimento Swap2Array (a, b: ponteiro n: inteiro) SwapDoubleTo8 (const a: double var b: TData8) Função Swap8ToDouble (var a: TData8): função dupla Swap2 (a: cardinal): palavra asm 160160bswap eax 160160shr eax, 16 função final Swap2signed (a: cardinal): smallint asm 160160bswap eax 160160shr eax, 16 função final Swap4 (a: cardinal): cardinal asm 160160bswap eax função final Swap4Signed (a: cardinal): longint as 160160bswap eax fim procedimento Swap2Array (a, b: ponteiro n: inteiro) asm 160160push ebx 160160x ou ebx, ebx 160160lea eax, eax ecx 2 160160lea edx, edx ecx 2 160160sub ebx, ecx 160160L1: 160160mov cx, palavra ptreax ebx 2 160160bswap cx 160160mov palavra ptredx ebx 2, cx 160160inc ebx 160160jnz L1 160160pop ebx finalizar procedimento Swap4Array (a, b: ponteiro n: inteiro) asm 160160push ebx 160160x ou ebx, ebx 160160lea eax, eax ecx 4 160160lea edx, edx ecx 4 160160sub ebx, ecx 160160L1: 160160mov ecx, dpg eXtrex ebx 4 160160bswap ecx 160160mov dword ptredx ebx 4, ecx 160160inc ebx 160160jnz L1 160160pop procedimento de final de ebx SwapDoubleTo8 (const a: double var b : TData8) asm 160160mov edx, dword ptra 160160mov ecx, dword ptra 4 160160bswap edx 160160bswap ecx 160160mov dword ptr eax, ecx 160160mov dword ptr eax 4, funo final edx Swap8ParaDouble (var a: TData8): var dupla 160160hold: asm duplo 160160m ov edx, dword ptreax 160160mov ecx, dword ptreax 4 160160bswap edx 160160bswap ecx 160160mov dword ptr espera, ecx 160160mov dword ptr espera 4, edx 160160fld procedimento de fim de espera SwapInt64To8 (const a: int64 var b: TData8) asm 160160mov edx, dword ptra 160160mov ecx, dword ptra 4 160160bswap edx 160160bswap ecx 160160mov dword ptr eax, ecx 160160mov dword ptr eax 4, funo final edx Swap8ToInt64 (var a: TData8): int asm 160160mov edx, ptreax dword 4 160160mov eax, ptreax dword 160160bswap edx 160160bswap eax end Como posso carregar uma imagem JPEG a partir de um arquivo de recursos vinculado ao meu aplicativo O seguinte demonstra a criação de um arquivo de recursos contendo uma imagem JPEG e o carregamento do arquivo JPEG do arquivo de recursos. A imagem JPEG resultante é exibida em um componente de imagem. Crie um arquivo de texto com a extensão. rc. O arquivo de texto deve ser nomeado com algo diferente do nome do projeto ou de qualquer nome de unidade em seu aplicativo para evitar qualquer confusão para o compilador. O arquivo de texto deve conter a seguinte linha: MYJPEG JPEG C: DownLoadMY. JPG Onde MYJPEG é o nome que você deseja nomear o recurso JPEG é o tipo de recurso definido pelo usuário. C: DownLoadMY. JPG é o caminho e o nome do arquivo do arquivo JPEG. Para nosso exemplo, nomearemos o arquivo foo. rc. Agora execute o programa BRCC32.exe (Borland Resource CommandLine Compiler) encontrado no diretório bin do Delphi / C Builders fornecendo o caminho completo para o arquivo rc: Agora você deve ter um arquivo de recurso compilado com o mesmo nome do arquivo. rc compilado a extensão de. res. A seguir demonstra o uso do JPEG incorporado em seu aplicativo: procedure LoadJPEGFromRes (TheJPEG: string ThePicture: TPicture) var 160160ResHandle: THandle 160160MemHandle: THandle 160160MemStream: TMemoryStream 160160ResPtr: PByte 160160ResTamanho: Longint 160160JPEGImage: TJPEGImage begin 160160ResHandle: FindResource (hInstance, PChar (TheJPEG ), 160160MemHandle: LoadResource (hInstance, ResHandle) 160160ResPtr: LockResource (MemHandle) 160160MemStream: TMemoryStream. Create 160160JPEGImage: TJPEGImage. Create 160160ResSize: SizeOfResource (hInstance, ResHandle) 160160MemStream. SetSize (ResSize) 160160MemStream. Write (ResPtr, ResSize) 160160FreeResource (MemHandle) 160160MemStream. Seek (0, 0) 160160JPEGImage. LoadFromStream (MemStream) 160160ThePicture. Assign (JPEGImage) 160160JPEGImage. Free 160160MemStream. Free finalizar procedimento TForm1.Button1Click (Sender: TObject) begin 160160LoadJPEGFromRes (MYJPEG, Image1.Picture) end tipo 160160TRGB registro 160160160160R: Inteiro 160160160160G: I 160160160160B: Inteiro 160160end tipo 160160THLS registro 160160160160H: Inteiro 160160160160L: Inteiro 160160160160S: Inteiro 160160end tipo 160160THWB registro 160160160160H: Inteiro 160160160160W: Inteiro 160160160160B: Inteiro 160160end função ColorToRGB (PColor: TColor): Função TRGB RGBToColor (PR, PG, PB: Integer ): Função TColor RGBToCol (PRGB: TRGB): Função TColor RGBToHLS (PRGB: TRGB): Função THLS HLSToRGB (PHLS: THLS): Função TRGB min (P1, P2, P3: double): Função dupla max (P1, P2, P3: double): Função dupla RGBToColor (PR, PG, PB: Inteiro): TColor começar 160160Resultado: TColor ((PB 65536) (PG 256) PR) função final ColorToRGB (PColor: TColor): TRGB var 160160i: Inteiro começa 160160i : PColor 160160Result. R: 0 160160Result. G: 0 160160Result. B: 0 160160 enquanto i - 65536 gt 0 do 160160begin 160160160160i: i - 65536 160160160160Resultado. B: Resultado. B 1 160160por 160160 enquanto i - 256 gt 0 do 160160begin 160160160160i: i - 256 160160160160Result. G: Resultado. G 1 160160e 16016Result. R: i função final RGBToCol (PRGB: TRGB): TColor começar 160160Resultado: RGBToColor (PRGB. R, PRGB. G, PRGB. B) função final RGBToHLS (PRGB: TRGB): THLS var 160160LR, LG, LB, LH, LL, LS, LMin, LMax: 160160LHLS dobro: 160160i de THLS: O começo inteiro 160160LR: PRGB. R / 256 160160LG: PRGB. G / 256 160160LB: PRGB. B / 256 160160LMin: (LR, LG, LB) 160160LMax : max (LR, LG, LB) 160160LL: (LMax LMin) / 2 160160 Se LMin LMax, em seguida, 160160 Iniciar 160160160160LH: 0 160160160160LS: 0 160160160160Result. H: redondo (LH 256) 160160160160Result. L: redondo (LL 256) 160160160160Resultados. S: redondo (LS 256) 160160160160exit 160160p� 160160if LL lt 0,5 depois 160160160160LS: (LMax - LMin) / (LMax LMin) 160160 se LL gt 0,5 depois 160160160160LS: (LMax - LMin) / (2.0 - LMax - LMin) 160160 se LR LMax depois 160160160160LH: (LG - LB) / (LMax - LMin) 160160 if LG LMax então 160160160160LH: 2.0 (LB - LR) / (LMax - LMin) 160160 Se LB LMax então 160160160160LH: 4.0 (LR - LG) / (LMax - LMin) 160160Result. H : r ound (LH 42.6) 160160Result. L: redondo (LL 256) 160160Result. S: função final redonda (LS 256) HLSToRGB (PHLS: THLS): TRGB var 160160LR, LG, LB, LH, LL, LS: 160160LHLS duplo: THLS 160160L1, L2: Duplo começo 160160LH: PHLS. H / 255 160160LL: PHLS. L / 255 160160LS: PHLS. S / 255 160160 if LS 0 depois 160160 Iniciar 160160160160Result. R: PHLS. L 160160160160Result. G: PHLS. L 160160160160Result. B: PHLS. L 160160160160 Saída 160160de 160160f LL lt 0,5 depois 160160160160L2: LL (1,0 LS) 160160 se LL gt 0,5 depois 160160160160L2: LL LS - LL LS 160160L1: 2,0 LL - L2 160160LR: LH 1,0 / 3,0 160160 se LR lt 0 depois 160160160160LR: LR 1,0 160160f LR gt 1 depois 160160160160LR: LR - 1,0 160160 se 6,0 LR lt1 depois 160160160160LR: L1 (L2 - L1) 6,0 LR 160160se se 2,0 LR lt1 depois 160160160160LR: L2 160160else se 3,0 LR lt2 depois 160160160160LR: L1 (L2 - L1 ) ((2,0 / 3,0) - LR) 6,0 160160else 160160160160LR: L1 160160LG: LH 160160 se LG lt 0 depois 160160160160LG: LG 1,0 160160 se LG gt 1 o n 160160160160LG: LG - 1.0 160160 if 6.0 LG lt 1 depois 160160160160LG: L1 (L2 - L1) 6.0 LG 160160else se 2.0 LG lt 1 depois 160160160160LG: L2 160160else se 3.0 LG lt 2 depois 160160160160LG: L1 (L2 - L1) ((2.0 / 3,0) - LG) 6,0 160160else 160160160160LG: L1 160160LB: LH - 1,0 / 3,0 160160if LB lt 0 depois 160160160160LB: LB 1,0 160160 se LB gt 1 depois 160160160160LB: LB - 1,0 160160 se 6,0 LB lt 1 depois 160160160160LB: L1 (L2 - L1 ) 6,0 LB 160160else se 2,0 LB lt1 depois 160160160160LB: L2 160160else se 3,0 LB lt2 depois 160160160160LB: L1 (L2 - L1) ((2,0 / 3,0) - LB) 6,0 160160else 160160160160LB: L1 160160Result. R: redondo (LR 255 ) 160160Result. G: redondo (LG 255) 160160Result. B: redondo (LB 255) função final max (P1, P2, P3: duplo): Duplo começo 160160Resultado: -1 160160if (P1 gt P2) então 160160begin 160160160160if (P1 gt P3), em seguida 160160160160begin 160160160160160160Resultado: P1 160160160160end 160160160160else 160160160160begin 160160160160160160Resultado: P3 160160160160e nd 160160por 160160else se P2 gt P3 depois 160160begin 160160160160resultado: P2 160160ar 160160else 160160160160resultado: função final min P3 (P1, P2, P3: duplo): Duplo começar 160160Resultado: -1 160160if (P1 lt P2) então 160160begin 160160160160if (P1 lt P3) em seguida, 160160160160begin 160160160160160160Result: P1 160160160160end 160160160160else 160160160160begin 160160160160160160Result: P3 160160160160end 160160end 160160else se P2 lt P3 então 160160begin 160160160160result: P2 160160end 160160else 160160160160result: finais P3 String-Grids são muito úteis, mas às vezes é necessário usar um própria Inplace-editor. Por exemplo, para fazer uma grade que permitirá apenas números, mas não caracteres de texto. Quando você está usando Grids (TStringGrid, TDBGrid), você pode inserir algum texto nas células da grade. Isso será feito com o editor do Inplace da Borland. Às vezes é necessário criar um editor próprio do Inplace, por exemplo, para evitar que o usuário forneça Texto em vez de número. O exemplo a seguir mostra como fazer isso. Primeiro você precisa de duas novas classes: uma para o seu Grid e uma para o seu editor do Inplace. Neste exemplo eu uso o TStringGrid, mas também deve funcionar com o TDBStringGrid. usa 160160Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários, Diálogos, 160160Grids 160160 // Meu próprio Inplace-Editor. Este Editor - por exemplo - apenas 160160 // permitir números, sem 160160TMyInplaceEdit classe (TInplaceEdit) 160160protected 160160160160procedure KeyPress (var Key: Char) substituir 160160end 160160 // Meu próprio StringGrid, que usará minha própria classe 160160TMyStringGrid do Editor-no-local (TStringGrid ) 160160protected 160160160160function CreateEditor: TInplaceEdit substituir 160160end // Aqui eu defino, que meu StringGrid deve usar MyInplace-Editor função TMyStringGrid. CreateEditor: TInplaceEdit começar 160160Resultado: TMyInplaceEdit. Create (Self) fim // O Inplace-Edit permite apenas numers, sem texto Procedimento de caracteres TMyInplaceEdit. KeyPress (var Key: Char) começa 160160 se não (Digite 0..9) e 160160begin 160160160160beep 160160160160Key: 0 160160end 160160else 160160160160inherited end Alguém sabe como obter o código HTML para o pai de um formulário ActiveX? problema que temos é um formulário ActiveX que é carregado em um documento HTML. Esse formulário ActiveX possui botões para carregar formulários ActiveX adicionais. Queremos colocar esses formulários ActiveX adicionais na página HTML atual em um quadro. O código abaixo mostra como pegar o documento, etc. de um ActiveForm. TYourActiveForm. YourMethod var 160160vClientSite: IOleClientSite 160160vContainer: IOleContainer 160160vServiceProvider: IServiceProvider 160160vDocument: IHTMLDocument2 160160vBackgroundImage: OleVariant começar 160160vClientSite: ActiveFormControl. ClientSite 160160vClientSite. GetContainer (vContainer) 160160if vContainer. QueryInterface (IServiceProvider, vServiceProvider) SOK então 160160begin 160160160160if vServiceProvider. QueryService (IIDIWebBrowserApp, IIDIWebBrowser2, 160160160160160160FBrowser) SOK então 160160160160begin 160160160160160160vDocument: FBrowser. Document como IHTMLDocument2 160160160160160160vBackgroundImage: vDocument. body. style. backgroundImage 160160160160160160if vBackgroundImage então 160160160160160160160160vBackgroundImage: vDocument. body. getAttribute (fundo, 0) 160160160160160160if vBackgroundImge ltgt então 160160160160160160160160ShowMessage (vBackgroundImage) 160160160160160160else 160160160160160160160160ShowMessage (Sem imagem de fundo definida.) 16016 Como criar e inserir um. wmf em um arquivo. rtf Bem, crie um metarquivo com o formato antigo do wmf (com falso aprimorado). Código como este funciona: var 160160f: TPicture 160160c: TMetafileCanvas 160160fs: TMemoryStream começa 160160f: TPicture. create 160160f. Metafile. width: 100 160160f. Metafile. height: 100 160160f. Metafile. Enhanced: falso 160160c: TMetafileCanvas. create (f. Metafile, 0) 160160c. Ellipse (5, 5, 95, 95) 160160c. Free end Obter os bytes do metarquivo, colocar em um buffer e chamar essa função: procedimento TRtfWriter. InsertWMFFromBuffer (Buffer: PByte const BufLen: integer 160160iWidth, iHeight: integer) var 160160wmfTag: string 160160HexEncoded: string 160160i: número inteiro começa 160160HexEncoded: 160160para i: 0 a BufLen - 1 do 160160begin 160160160160HexEncoded: HexEncoded IntToHex (Buffer, 2) 160160160160Inc (Buffer) 160160end 160160 160160HexEncoded: Copiar (HexEncoded, (tamanho do (LongInt) Tamanho de (SmallInt) Tamanho de (TSmallRect) 160160160160 Tamanho (Word) Tamanho de (LongInt) Tamanho de (Word)) 2 1, 160160160160Comprimento (HexEncoded)) 160160HexEncoded: LowerCase (HexEncoded) 160160wmfTag: 160160wmfTag: Formato (wmf Tag, iWidth 20, iHeight 20, HexEncoded) 160160fStream. Write (wmfTag1, Comprimento (wmfTag)) end Observe que fStream é um fluxo com o arquivo rtf em que minha classe TRtfWriter está trabalhando. Você terá que fazer o trabalho do rtf, mas é o caminho para inserir um arquivo wmf. Se você quiser um teste rápido, coloque-o na parte superior do arquivo: e no final, eu tenho um formulário com um controle de página, e cada folha de guia do controle de página contém um quadro. Gostaria de excluir o quadro junto com a planilha pai se o usuário clicar em um determinado botão no quadro. Qual é a melhor maneira de fazer isso? Parece que se o método livre de guias de guia é chamado de dentro do manipulador de eventos de clique de botão, o botão será liberado antes que o manipulador de eventos seja concluído a execução. A maneira de resolver isso é como TCustomform. Release faz isso: postar (via PostMessage) uma mensagem de usuário para o formulário, ter o formulário livre o componente em resposta à mensagem. const 160160UMDESTROYCONTROL WMUSER 230 procedimento UmDestroyControl (var msg: TMessage) mensagem UMDESTROYCONTROL var 160160ctrl: TWinControl iniciar 160160ctrl: GetParentForm (remetente como TButton) 160160PostMessage (ctrl. handle, UMDESTROYCONTROL, 0, inteiro (remetente)) 160160 procedimento TForm1.UmDestroyControl (var msg : TMessage) begin 160160TObject (msg. lparam).Free fim Como adicionar programas para o procedimento de menu iniciar do Windows CreateStartmenuLink (ExeFile, WorkPath, Args, descr: string) var 160160MyObject: IUnknown 160160MyLink: IShellLink 160160MyFile: IPersistFile 160160ds: WideString 160160StartMenuDir: string 160160reginfo: TRegIniFile 160160reg: TRegistry 160160s: cadeia começar 160160regInfo: 160160160160TRegIniFile. Create (SoftwareMicrosoftWindowsCurrentVersionExplorer) 160160StartMenuDir: regInfo. ReadString (pastas de shell, menu Iniciar,) 160160regInfo. Free 160160s: ExtractFilePath (StartMenuDir Descr. lnk) 160160DirectorDirectories 160160if FileExists (StartMenuDir Descr. Lnk), em seguida, 1601 60160160DeleteFile (StartMenuDir Descr. lnk) 160160MyObject: CreateComObject (CLSIDShellLink) 160160MyLink: MyObject como IShellLink 160160MyFile: MyObject como IPersistFile 160160MyLink. SetArguments (PChar (Args)) 160160MyLink. SetPath (PChar (ExeFile)) 160160MyLink. SetWorkingDirectory (PChar (WorkPath)) 160160s: ExtractFileName (StartMenuDir Descr. lnk) 160160s: cópia (s, 1, comprimento (s) - 4) 160160MyLink. SetDescription (PChar (s)) 160160ds: StartMenuDir Descr. lnk 160160MyFile. Save (PWChar (ds), false) 160160reg: TRegistry. Create 160160reg. RootKey: HKEYUSERS 160160reg. openkey (.DefaultSoftwareMicrosoftWindowsCurrentVersionExplorerShell Pastas, true) 160160StartMenuDir: reg. ReadString (Menu Iniciar) 160160reg. closekey 160160reg. free 160160s: ExtractFilePath (StartMenuDir Descr. lnk) 160160ForceDirectories (s) 160160if FileExists (StartMenuDir Descr. Lnk), em seguida, 160160160160DeleteFile (StartMenuDir Descr. Lnk) 160160ds: StartMenuDir Descr. lnk 160160MyFile. Save (PWChar (ds), fals e) tipo final 160160TShellLinkInfo ficha 160160160160PathName: 160160160160Arguments de cadeia: cadeia 160160160160Description: cadeia 160160160160WorkingDirectory: cadeia 160160160160IconLocation: cadeia 160160160160IconIndex: número inteiro 160160160160ShowCmd: número inteiro 160160160160HotKey: palavra 160160end função GetSpecialFolderPath (Pasta: Integer CaNcReaTe: booleana): 160160string var 160160FilePath: array0..MAXPATH de char begin 160160 160160SHGetSpecialFolderPath (0, Caminho de Arquivo, Pasta, CanCreate) 160160Resultado: FilePath end função CreateShellLink (const AppName, Desc: stringDest: Integer): string Link será localizado na pasta especificada por Dest. Retorna o nome do caminho completo do arquivo de link var 160160SL: IShellLink 160160PF: IPersistFile 160160LnkName: WideString begin 160160OleCheck (CoCreateInstance (CLSIDShellLink, nada, CLSCTXINPROCSERVER, IShellLink, 160160160160SL)) 160160 160160Obtenha um ponteiro de interface para ele. 160160PF: SL como IPersistFile 160160OleCheck (SL. SetPath (PChar (AppName))) 160160 if Desc 16160160160OleCheck (SL. SetDescription (PChar (Desc)) 160160LnkName: GetSpecialFolderPath (Dest, True) ChangeFileExt (AppName,.lnk) 160160PF. Save (PWideChar (LnkName), True) 160160Resultado: LnkName end Consulte SHGetSpecialFolderLocation ou ShlObj. pas para as CSIDLconstants. Como determinar o caminho de um TTable Quando uma tabela é referenciada através de um alias, o caminho físico não está prontamente disponível. Para obter esse caminho, use a função BDE DbiGetDatabaseDesc. Essa função usa o nome do alias e um ponteiro para uma estrutura DBDesc. A estrutura DBDesc será preenchida com as informações pertencentes a esse alias. Essa estrutura é definida como: O nome físico / caminho estará contido no campo szPhyName da estrutura DBDesc. Valores de retorno possíveis para a função DBIGetDatbaseDesc são: DBIERRNONE A descrição do banco de dados para pszName foi recuperada com êxito. DBIERROBJNOTFOUND O banco de dados nomeado em pszName não foi encontrado. O exemplo de código abaixo ilustra como obter o nome do caminho físico de um componente TTable usando o alias DBDemos: var 160160vDBDesc: DBDesc 160160DirTable: string begin 160160Check (DbiGetDatabaseDesc (PChar (Table1.DatabaseName), vDBDesc)) 160160DirTable: Formato (ss, vDBDesc. szPhyName, Table1.TableName) 160160ShowMessage (DirTable) end Aqui estão três maneiras de obter o caminho associado a um alias. a) é apenas para aliases permanentes. b) works on BDE and local aliases and c) works with BDE and local aliases as well as with tables with a hardcoded path, using DBI calls. a) For permanent aliases only function GetDBPath1(AliasName: string): TFileName var 160160ParamList: TStringList begin 160160ParamList : TStringList. Create 160160with Session do 160160try 160160160160GetAliasParams(AliasName, ParamList) 160160160160Result : UpperCase(ParamList. ValuesPATH) 160160finally 160160160160Paramlist. Free 160160end end b) Works on BDE and local aliases function GetDBPath2(AliasName: string): TFileName var 160160ParamList: TStringList 160160i: integer begin 160160ParamList : TStringList. Create 160160with Session do 160160try 160160160160try 160160160160160160GetAliasParams(AliasName, ParamList) 160160160160except 160160160160160160for i : 0 to pred(DatabaseCount) do 160160160160160160160160if (Databasesi. DatabaseName AliasName) then 160160160160160160160160160160ParamList. Assign(Databasesi. Params) 160160160160end 160160160160Result : UpperCase(ParamList. ValuesPATH) 160160finally 160160160160Paramlist. Free 160160end end c) The following example assumes the TT able being active function GetDBPath3(ATable: TTable): TFileName var 160160TblProps: CURProps 160160pTblName, pFullName: DBITblName begin 160160with ATable do 160160begin 160160160160AnsiToNative(Locale, TableName, pTblName, 255) 160160160160Check(DBIGetCursorProps(Handle, TblProps)) 160160160160Check(DBIFormFullName(DBHandle, pTblName, TblProps. szTableType, pFullName)) 160160160160Result : ExtractFilePath(StrPas(pFullName)) 160160end end This article illustrates the usage of the TInifile object, and gives guideline when and how to use ini files for the storage of personal settings. This article is part of a series of five articles about preserving user sensitive settings. INI-files are meant to retain settings between instances of your applications. Their structure is very simple, which limits their functionality. This article explains the structure of ini files, and the basics of how to read and write them from Delphi. Structure of ini files Lets first have a look at the structure of ini-files. Basically, an ini file has a number of blocks, enclosed in square brackets, and every block has some settings. Example: here is a part of my W2000 win. ini file: Note-1This section is required only to install the optional WinZip Internet Browser Support build 0231. Note-2Removing this section of the win. ini will have no effect except preventing installation of WinZip Internet Browser Support build 0231. MAPI 1.0 Time Zone StandardNameGMT Standard Time DaylightNameGMT Daylight Time We have blocks between square brackets, such as The data behind an item name can be alphabetical, numeric or boolean. Binary data is limited to those data which does no contains a 0 or CR/LF. Blank lines may be used between the blocks. As you can see above, many applications use the win. ini file to store settings-information. You are free to choose the win. ini file. If you have just a few settings, this may be the right choice. Other applications should not suffer in any way. If you have more than one block of information, it is preferable to define your own ini file. Writing ini-files from Delphi Delphi provides us with a TIniFile object. This object is defined in the unit ini-files. Add this unit to your uses clause. Then create : You may or may not include a path with the filename. If you dont, windows will assume it must be created in the windows directory. This is the default. By using the ExtractFileDir(Application. Exename), you can easily create ini-files in the directory in which your application is created. Simply pass the entire path with the file name. If the file already exists, windows will open it. If it does not, windows will create it. The next thing you will want is to write some information to it. We will construct a small demo application. Start your Delphi, choose new application, and save your form as formDemoIniFile, and your project as DemoIniFile. Put a textbox, a SaveFile dialog and an OpenDialog component on your form. Next, drop two buttons on your form, and call them btnExit and btnOpenFile. In the btnOpenFileClick event, write: procedure TForm1.btnFileOpenClick(Sender: TObject) var 160160lIniFileVar: TIniFile begin 160160OpenDialog1.Filter : Text files. txtAll files. 160160if OpenDialog1.execute then 160160begin 160160160160edit1.text : OpenDialog1.FileName 160160160160lIniFileVar : TIniFile. create(DemoApp. ini) 160160160160lIniFileVar. WriteString(OPENEDFILES, OPENDIALOG1, edit1.text) 160160160160lIniFileVar. WriteString(OPENEDFILES, OPENDIALOG1LASTDIR, 160160160160160160ExtractFileDir(edit1.text)) 160160160160lIniFileVar. free 160160end end lIniFileVar is a local variable in this routine of th type TIniFile. When we create it, we pass the filename, in this case DemoApp. ini. Next we use the WriteString method to write the contents of to the edit1.text to the inifile. We specify this string must be stored in the block OPENEDFILES and that the item name OPENDIALOG1. next we also write the directory. After we have run this program, the result might look: Writing numeric data is essentially the same, and so is writing booleans. Reading them from Delphi Of course we gain nothing when we can write data but cannt read them. So we expand our example a bit with a few lines to read the previous data before we present the OpenFileDialog. procedure TForm1.btnFileOpenClick(Sender: TObject) var 160160lIniFileVar: TIniFile begin 160160// read old data and assign them to OpenFile dialog. 160160lIniFileVar : TIniFile. create(DemoApp. ini) 160160OpenDialog1.FileName : lIniFileVar. ReadString(OPENEDFILES, OPENDIALOG1, ) 160160OpenDialog1.InitialDir : lIniFileVar. ReadString(OPENEDFILES, 160160160160160160160160160160160160160160160160 OPENDIALOG1LASTDIR, ) 160160lIniFileVar. Free 160160OpenDialog1.Filter : Text files. txtAll files. 160160// ask user to open file 160160if OpenDialog1.execute then 160160begin 160160160160edit1.text : OpenDialog1.FileName 160160160160// Store new file data in ini file. 160160160160lIniFileVar : TIniFile. create(DemoApp. ini) 160160160160lIniFileVar. WriteString(OPENEDFILES, OPENDIALOG1, edit1.text) 160160160160lIniFileVar. WriteString(OPENEDFILES, OPENDIALOG1LASTDIR, 160160160160160160ExtractFileDir(edit1.text)) 160160160160lIniFileVar. free 160160end end Note that the ReadString Function requires a third argument, this is the default value. Note that one may use the ReadSectionValues (const Section: string Strings: TStrings) method to read all values of an entire section. There are some circumstances in which you might want to read an entire block (also called section). If you wish to use this function, some Delphi hacking might be useful. By default, the buffer for the reading sections is 16K. You can upgrade this to 32K no problem.160160 Simply start Delphi, open Program FilesBorlandDelphi5SourceVclinifil. pas, and look for the ReadSection and ReadSections procedures. Both have a constant : Change this constant to 32768 and you claim double the amount of memory. When you study this unit, you will find that all methods boil down to usage of the windows WritePrivateProfileString and GetPrivateProfileString functions. The unit has no WriteSectionValues procedure. Should you wish, it can be easily added. 160160160160 procedure TCustomIniFile. WriteSectionValues(const Section: 160160string Strings: TStrings) var 160160KeyList: TStringList 160160i: Integer begin 160160KeyList : TStringList. Create 160160for i : 0 to Strings. Count - 1 do 160160begin 160160160160WriteString(Section, Strings. Namesi, 160160160160160160Strings. ValuesStrings. Namesi) 160160end end There is an alternative for the usage of the TInifile object. Any TStringList has a LoadFromFile and SaveToFile method. Using the Values property, one could extract item values from them, and even change them. But as these methods do not adhere to the windows apis and their rules about file locations, this practice is not recommended. Also, as the Values property does not support usage of sections, this may lead to problems with duplicate item names. You now know how to use ini-files. You should also be aware of its possibilities. As for its limitations: Dont try to store binary data. Neither store strings which contain a CR/LF, as your values can be just 1 line of160160length. In order to give a control the appearance of being transparent, in the WMEraseBkgnd message processing section Im invalidating the rectangle the control covers in the parent controls context and then having the parent control repaint itself in the rectangle thats hidden behind the control. However, this doesnt work when the controls DoubleBuffer property is set to true. Does anyone know how to get this working with double buffered controls VCL double-buffering is ineffective and limited. If you need double-buffering, you will need to implement it yourself. To do this process the WMPAINT message and do something like this: 1) Do your own effective double-buffering: procedure TCustomElPanel. WMPaint(var Msg: TWMPaint) var 160160DC, MemDC: HDC 160160MemBitmap, OldBitmap: HBITMAP 160160PS: TPaintStruct 160160R: TRect 160160ARgn: HRGN begin 160160if (Msg. DC ltgt 0) then 160160160160PaintHandler(Msg) 160160else 160160begin 160160160160DC : GetDC(0) 160160160160MemBitmap : CreateCompatibleBitmap(DC, ClientRect. Right, ClientRect. Bottom) 160160160160ReleaseDC(0, DC) 160160160160MemDC : CreateCompatibleDC(0) 160160160160OldBitmap : SelectObject(MemDC, MemBitmap) 160160160160try 160160160160160160DC : BeginPaint(Handle, PS) 160160160160160160GetClipBox(DC, R) 160160160160160160if IsRectEmpty(R) then 160160160160160160160160R : ClientRect 160160160160160160else 160160160160160160begin 160160160160160160160160InflateRect(R, 1, 1) 160160160160160160end 160160160160160160with R do 160160160160160160160160ARgn : CreateRectRgn(Left, Top, right, Bottom) 16 0160160160160160SelectClipRgn(MemDC, ARgn) 160160160160160160Perform(WMERASEBKGND, MemDC, MemDC) 160160160160160160Msg. DC : MemDC 160160160160160160WMPaint(Msg) 160160160160160160SelectClipRgn(MemDC, 0) 160160160160160160DeleteObject(ARgn) 160160160160160160Msg. DC : 0 160160160160160160with R do 160160160160160160160160BitBlt(DC, Left, Top, Right, Bottom, MemDC, Left, Top, SRCCOPY) 160160160160160160EndPaint(Handle, PS) 160160160160finally 160160160160160160SelectObject(MemDC, OldBitmap) 160160160160160160DeleteDC(MemDC) 160160160160160160DeleteObject(MemBitmap) 160160160160end 160160end end 2) When painting, ask your parent to draw on your canvas or do the following: if Transparent then begin 160160GetClipBox(Canvas. Handle, Rect) 160160OffsetRect(Rect, Left, Top) 160160RedrawWindow(Parent. Handle, Rect, 0, RDWERASE or RDWINVALIDATE or 160160160160RDWNOCHILDREN or RDWUPDATENOW) 160160begin 160160160160OffsetRect(Rect, - Left, - Top) 160160160160DC : GetDC(Handle) 160160160160bitblt(Canvas. Handle, 0, 0, Rect. Right - Rect. Left, Rect. Bottom - Rect. Top, 160160160160160160DC, Rect. Left, Rect. Top, SRCCOPY) 160160160160ReleaseDC(Handle, DC) 160160end endBoard index raquo delphi raquo Delphi 2007 - IDE just closes Re:Delphi 2007 - IDE just closes Thanks for all the posts, but I think I found the problem. Im using special GExperts version with integrated DelForEx code formater from dummzeuch. de/delphi/gexperts/english. html It seems that the problem only happens when CodeProof option is active in GExperts. After I turned it off, the problem seems to have disappeared. Maybe the IDE should have some kind of protection to avoid plugins to just quotkillquot it without even showing an error message. quotCarlosquot ltwarmboo. hotmailgt escreveu na mensagem news:47d045d01newsgroups. borland. gt Finally I decided to move from TurboDelphi Pro 2006 to Delphi 2007 (latest gt ISO available) and now Im suffering from a very critical problem: gt After loading a project and start working on it, for no apparent reason, gt the IDE just closes No errors or messages is shown. It justs disappears gt Everytime this happens, I loose everything I was doing :-( gt Looks like switching to D2007 was bad decision. gt Anyone suffering with this problem Anything that can be done Sun, 29 Aug 2010 21:25:00 GMT Re:Delphi 2007 - IDE just closes Ok, it seems that GExperts was not the guilt. After some days of work with no problems, today I faced the problem again. So, I removed GExperts, and could reproduce the problem in a specific form, when inserting a new OnBeforeInsert event code, and putting the mouse over some declaration (what triggers the help insight tooltip). So, I disabled Tooltip Help Insight, and the problem quotseemsquot to have stoped (lets see if there will be no more surprises) :-( quotCarlosquot ltwarmboo. hotmailgt escreveu na mensagem news:47d054c61newsgroups. borland. gt Thanks for all the posts, but I think I found the problem. gt Im using special GExperts version with integrated DelForEx code formater gt from dummzeuch. de/delphi/gexperts/english. htm l gt It seems that the problem only happens when CodeProof option is active in gt GExperts. After I turned it off, the problem seems to have disappeared. gt Maybe the IDE should have some kind of protection to avoid plugins to just gt quotkillquot it without even showing an error message. gt quotCarlosquot ltwarmboo. hotmailgt escreveu na mensagem gt news:47d045d01newsgroups. borland. gtgt Finally I decided to move from TurboDelphi Pro 2006 to Delphi 2007 gtgt (latest ISO available) and now Im suffering from a very critical gtgt problem: gtgt After loading a project and start working on it, for no apparent reason, gtgt the IDE just closes No errors or messages is shown. It justs disappears gtgt Everytime this happens, I loose everything I was doing :-( gtgt Looks like switching to D2007 was bad decision. gtgt Anyone suffering with this problem Anything that can be done Other Threads
Comments
Post a Comment