Ver Mensaje Individual
  #15  
Antiguo 23-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - Espańa
Posts: 19.437
Reputación: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Para que te hagas una idea de cómo lo hago yo...

Código Delphi [-]
procedure TLeyendaNode.DrawBody(Canvas: TCanvas);
var
  i:Integer;
  obj:TGraphNode;
  _MinWidth:Integer;
begin
  inherited;

  // controlar el estado
  if (Self.State = osDestroying) then begin
    Exit;
  end;

  //- Owner.BeginUpdate;
  // proteccion
  try

    // AutoDimensionar
    if (FAutoSizeHeight) then begin
      Self.Height := DEFAULT_HEIGHT_TITLE +
                  (FTextNodes.Count * DEFAULT_HEIGHT_ELEMENT) +
                  (DEFAULT_HEIGHT_ELEMENT DIV 2);
      // Objeto en sí
      Self.Width := Max(Self.Width, DEFAULT_HEIGHT_ELEMENT);
    end;

    _MinWidth := 0;


    // Recolocar
    for i := 0 to (FTextNodes.Count - 1) do begin
      // Cuadro de color
      obj := TGraphNode(FColorNodes.Objects[i]);
      obj.OwnerNode := Self;
      obj.Left := Self.Left + LEFT_SPACE;
      obj.Top := Self.Top + DEFAULT_HEIGHT_TITLE + (DEFAULT_HEIGHT_ELEMENT * i);
      obj.Width := DEFAULT_HEIGHT_ELEMENT;
      obj.Height := DEFAULT_HEIGHT_ELEMENT - 1;
      obj.Brush.Color := StrToInt(FColorNodes.Strings[i]);
      obj.Pen.Color := clGray;
      obj.CanSelect := False;

      // Texto
      obj := TGraphNode(FTextNodes.Objects[i]);
      obj.Left := Self.Left + LEFT_SPACE + DEFAULT_HEIGHT_ELEMENT + LEFT_SPACE;
      obj.Top := Self.Top + DEFAULT_HEIGHT_TITLE + (DEFAULT_HEIGHT_ELEMENT * i);
      obj.Width := Self.Width - LEFT_SPACE - DEFAULT_HEIGHT_ELEMENT - LEFT_SPACE -
                   (SOMBRA_WIDTH * 2);
      obj.Height := DEFAULT_HEIGHT_ELEMENT;
      obj.Alignment := taLeftJustify    ;
      obj.Text := FTextNodes.Strings[i];

      _MinWidth := Max(_MinWidth, Canvas.TextWidth(obj.Text) + (LEFT_SPACE * 2));

      obj.Pen.Style := psClear;
      obj.CanSelect := False;
    end;

    // No asignado?
    if not Assigned(FTitleNode) then begin
      // Crear el título
      FTitleNode := Owner.InsertNode(nil, TEtiquetaNode{TRectangularNode});
      FTitleNode.OwnerNode := Self;
      FTitleNode.Visible := Self.Visible;
      FTitleNode.Top := Top;
      FTitleNode.Left := Left;
      FTitleNode.Height := DEFAULT_HEIGHT_ELEMENT - (SOMBRA_WIDTH * 2);
      FTitleNode.Width := Width;
      FTitleNode.CanSelect := False;
      FTitleNode.BringToFront;

      FTitleNode.Selected := False;
      FTitleNode.CanSelect := False;
      FTitleNode.Font.Style := FTitleNode.Font.Style + [fsBold];
    end;

    // Titulo
    FTitleNode.Top := Top + 1;
    FTitleNode.Left := Left + (DEFAULT_HEIGHT_ELEMENT div 2);
    FTitleNode.Width := Width - SOMBRA_WIDTH - DEFAULT_HEIGHT_ELEMENT;
    FTitleNode.Text := FTitle;
    FTitleNode.Font.Color := clBlack;

    _MinWidth := Max(_MinWidth, Canvas.TextWidth(FTitleNode.Text) +
                 (DEFAULT_HEIGHT_ELEMENT * 2));


    // AutoDimensionar
    if (FAutoSizeWidth) then begin
      // Objeto en sí
      Self.Width := Max(_MinWidth, DEFAULT_HEIGHT_ELEMENT);
    end;

  finally
    //- Owner.EndUpdate;
  end;
end;

Es un objeto que correspomde a un cuadro de leyenda.



Como ves es un objeto al que se le pasan un número de elementos (Texto + Color); Al mover la leyenda se posicionan de nuevo los elementos interiores.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita