Como funcionam os Namespaces em Delphi?
Marc Rohloff publicou um artigo no Borland Developer Network sobre como o Delphi 2005 trata a questão dos namespaces.
Polindo bits e bytes todos os dias!
Marc Rohloff publicou um artigo no Borland Developer Network sobre como o Delphi 2005 trata a questão dos namespaces.
Postado por Massuda às 17:42 0 comentários
Marcadores: delphi
O pessoal do C# Team da Microsoft escreveu sobre como criar uma constante array. A sugestão é fazer:
para criar um array de constantes inteiras. Mas existe um pequeno problema... embora o array não possa ser modificado, cada elemento individual pode ser alterado!1 static readonly int [] constIntArray = 2 new int[] {1, 2, 3};
Postado por Massuda às 16:46 0 comentários
Duncan Mackenzie escreveu sobre como desenhar texto rotacionado. O exemplo, em VB.NET, é:
1 Public Enum Direction As Integer 2 N = 0 3 NE = 1 4 E = 2 5 SE = 3 6 S = 4 7 SW = 5 8 W = 6 9 NW = 7 10 End Enum 11 12 Protected Overrides Sub OnPaint(ByVal e As 13 System.Windows.Forms.PaintEventArgs) 14 15 e.Graphics.Clear(Me.BackColor) 16 17 Dim bounds As Rectangle 18 Dim g As Graphics 19 Dim rotation As Single = 0 20 21 g = e.Graphics 22 bounds = New Rectangle(50, 50, Me.Width - 100, 23 Me.Height - 100) 24 25 Dim rect As System.Drawing.RectangleF 26 27 g.DrawEllipse(Pens.Black, bounds) 28 29 Dim myMatrix As Drawing2D.Matrix 30 Dim sf As New StringFormat(StringFormatFlags.NoWrap) 31 32 sf.Alignment = StringAlignment.Center 33 myMatrix = g.Transform() 34 rect = New System.Drawing.RectangleF(bounds.X, 35 bounds.Y, bounds.Width, bounds.Height) 36 37 For i As Integer = 0 To 7 38 If i > 0 Then 39 myMatrix.RotateAt(45, 40 New PointF(Me.Width / 2, Me.Height / 2), 41 Drawing.Drawing2D.MatrixOrder.Append) 42 g.Transform = myMatrix 43 End If 44 45 Dim directionString As String 46 47 directionString = 48 System.Enum.GetName(GetType(Direction), i) 49 g.DrawString(directionString, 50 New Font("Arial", 12, FontStyle.Bold), 51 Brushes.Black, rect, sf) 52 Next 53 End Sub
Postado por Massuda às 09:19 0 comentários
Cultura inútil: o tamanho máximo de um identificador no compilador C# da Microsoft é 512 caracteres. O compilador Mono parece ter o mesmo limite (via Jon Skeet no NG ms.p.dn.languages.csharp).
Postado por Massuda às 15:32 0 comentários
Do fórum do ClubeDelphi:
Quando crio um projeto MDI, e consequentemente os forms MDI filhos, em geral coloco a propriedade Position = poMainFormCenter. Porém, ao abrir o form filho nunca ele aparece posicionado exatamente no centro do form principal. Sempre aparece posicionado um pouco para baixo do centro. Já tentei colocar a propriedade Position em todas as outras opções de "center", mas sempre o form abre decentralizado. Quando os forms são pequenos não tem problema, mas quando ocupam a maior parte da dimensão vertical da tela, eles aparecem cortado embaixo. Ou melhor, uma faixa da parte de baixo fica escondida.
Esse problema ocorre porque o Delphi irá centrar a janela MDI filha na área cliente da janela pai, que não coincide com a área cliente MDI da janela pai. A área cliente é toda área da janela exceto o título e as bordas enquanto a área cliente MDI é a área utilizada pelas janelas MDI filhas.
O código seguinte centra a janela filha na janela pai:
1 type 2 TFormFilho = class(TForm) 3 public 4 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; 5 end; 6 7 ... 8 9 procedure TFormFilho.SetBounds(ALeft, ATop, AWidth, 10 AHeight: Integer); 11 var 12 MainForm: TForm; 13 Rect: TRect; 14 Origem: TPoint; 15 begin 16 if Showing then begin 17 18 MainForm := Application.MainForm; 19 20 // Obtem o retângulo da área cliente MDI 21 Windows.GetWindowRect(MainForm.ClientHandle, Rect); 22 23 // Calcula a origem da área cliente MDI no form 24 Origem := Rect.TopLeft; 25 Dec(Origem.x, MainForm.Left); 26 Dec(Origem.y, MainForm.Top); 27 28 // Calcula nossa nova posição 29 ALeft := (MainForm.Width - Width) div 2 - Origem.x; 30 ATop := (MainForm.Height - Height) div 2 - Origem.y; 31 end; 32 33 inherited SetBounds(ALeft, ATop, AWidth, AHeight); 34 end;
O código seguinte centra a janela filha na área cliente MDI da janela pai:
1 type 2 TFormFilho = class(TForm) 3 public 4 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; 5 end; 6 7 ... 8 9 procedure TFormFilho.SetBounds(ALeft, ATop, AWidth, 10 AHeight: Integer); 11 var 12 MainForm: TForm; 13 Rect: TRect; 14 OurWidth: Integer; 15 OurHeight: Integer; 16 begin 17 if Showing then begin 18 19 MainForm := Application.MainForm; 20 21 // Obtem o retângulo da área cliente MDI 22 Windows.GetWindowRect(MainForm.ClientHandle, Rect); 23 24 // Calcular largura e altura da área cliente 25 OurWidth := Rect.Right - Rect.Left; 26 OurHeight := Rect.Bottom - Rect.Top; 27 28 // Calcula a nova posição 29 ALeft := (OurWidth - Width) div 2; 30 ATop := (OurHeight - Height) div 2; 31 end; 32 33 inherited SetBounds(ALeft, ATop, AWidth, AHeight); 34 end;
Postado por Massuda às 11:48 1 comentários
Marcadores: delphi
No Borland Developer Network existem alguns artigos discutindo implementações dos Patterns GOF em C#.
Postado por Massuda às 12:28 0 comentários
No ng microsoft.public.dotnet.languages.csharp apareceu hoje uma thread sobre quando marcar a aplicação como sendo STA (Single Thread Apartment) ou MTA (Multi Thread Apartment). Um dos replies indicou um artigo interessante sobre o assunto, Apartments and Pumping in the CLR. O default para um aplicativo Windows Form é usar STA na thread principal.
In general, the only time you want to explicitly set the apartment state is if you are doing COM interop with STA components. You want your thread apartment type to match the threading model of any COM objects the thread uses to minimize performance hits.
Postado por Massuda às 10:13 0 comentários
Marcadores: .net
Lendo hoje a thread "VS.NET vs. Delphi8.NET" no ng borland.public.delphi.language.delphi.dotnet, encontrei a seguinte afirmação:
Postado por Massuda às 17:19 0 comentários
Marcadores: .net
Por causa de uma dúvida postada no Fórum MSDN Brasil, descobri que o framework não disponibiliza funções de cálculo estatístico. O que relamente me surpreendeu foi que o framework disponibiliza funções de cálculo financeiro no namespace Microsoft.VisualBasic.Financial.
Postado por Massuda às 00:56 0 comentários
Marcadores: .net
Levei uma boa surra hoje ao tentar ler abrir um arquivo de ajuda em formato HTML compactado (HTML Help, extensão .chm).
Primeiro, baixei o arquivo da internet numa pasta qualquer e dei olhada nele sem problemas. Daí movi o arquivo para a pasta onde eu pretendia que ele ficasse. Como era um arquivo relacionado com C#, queria deixá-lo numa pasta dentro de outra de nome C#. Para minha supresa, não consegui mais abrir o arquivo. Tudo que aparecia era a página de erro do IE indicando que "a página não pode ser exibida". Voltei o arquivo para a pasta inicial e, nova surpresa, o arquivo abre sem problemas.
Minha primeira idéia: o componente HTML Help mantinha uma lista com os caminhos para os arquivos que ele abria. Pensando dessa forma, revirei o Registro do Windows e meu HD buscando por algo que tivesse essa informação. Resultado: não encontrei nada que indicasse que minha conclusão estava certa.
Pesquisando no Google, encontrei a seguinte thread no NG microsoft.public.windowsxp.general. Resumindo:
Postado por Massuda às 12:34 0 comentários
Marcadores: geral
Usando Reflection, é possível manipular as propriedades de um objeto da maneira que você quiser.
1 using System.Reflection; 2 3 public static void ListarPropriedades(object o) { 4 5 Type t = o.GetType(); 6 7 foreach (PropertyInfo pi in t.GetProperties()) { 8 9 Console.WriteLine(string.Format("{0} {1}", 10 pi.PropertyType.FullName, pi.Name)); 11 } 12 }
1 using System.Reflection; 2 3 public static void ListarValores(object o) { 4 5 Type t = o.GetType(); 6 7 foreach (PropertyInfo pi in t.GetProperties()) { 8 9 Console.WriteLine(string.Format("{0} {1} = {2}", 10 pi.PropertyType.FullName, pi.Name, 11 pi.GetValue(o, null))); 12 } 13 }
1 using System.Reflection; 2 3 public static void AlterarValor(object o, 4 string propriedade, object valor) { 5 6 Type t = o.GetType(); 7 8 foreach (PropertyInfo pi in t.GetProperties()) { 9 10 if (pi.Name.Equals(propriedade)) { 11 12 pi.SetValue(o, valor, null); 13 break; 14 } 15 } 16 }
Note que AlterarValor() pode receber qualquer objeto como argumento, independente do objeto possuir ou não a propriedade desejada; se o objeto possuir a propriedade, o valor dela será ajustado para o valor fornecido.
Outro ponto: como o valor é passado como um object, dependendo como o argumento é passado, existe uma penalidade envolvida que é o boxing do argumento.
Postado por Massuda às 17:46 0 comentários
Componentes para acesso ao PostgreSQL que podem ser usando com C#:
Atualizado em 13/01/2007
Postado por Massuda às 12:25 0 comentários
Este é o primeiro registro neste blog, nada de excepcional, apenas um ponto de partida. Espero poder manter este blog atualizado, já que minha tentativa anterior de manter um site atualizado no GeoCities não foi muito feliz. Manter um blog parece dar menos trabalho e é com isso que estou contando.