Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tachar una palabra en delphi (https://www.clubdelphi.com/foros/showthread.php?t=82531)

teecweb 15-03-2013 14:57:53

Tachar una palabra en delphi
 
Holas tengo un checkboxlist ..quisiera que cada vez que selecciono un item y presiono un boton ...ese item se tachara es decir que salga una linea al medio de el item..gracias por sus respuestas...:D

Neftali [Germán.Estévez] 15-03-2013 16:52:37

Seguramente lo más fácil es derivar el componente estandard para modificar el comportamiento del Paint.
Si miras el componente TCheckListBox, verás que hay el siguiente método:

Código Delphi [-]
  procedure DrawItem(Index: Integer; Rect: TRect;   State: TOwnerDrawState); override;

Que tiene muy buena pinta de servir para lo que necesitas.

Una prueba rápida... Si derivamos el componente y simplemente añadimos estas líneas veremos que el comportamiento se acerca bastante a lo que necesitas:

Código Delphi [-]
procedure tchecklistBox1.DrawItem(Index: Integer; Rect: TRect;
                                  State: TOwnerDrawState);
begin
  inherited;
  if Self.Checked[Index] then begin
    Self.Canvas.MoveTo(Rect.Left, Rect.Top + 5);
    Self.Canvas.LineTo(Rect.Right, Rect.Top + 5);
  end;
end;

Se ve algo como esto. Falta pulirlo, pero creo que por ahí puedes conseguir lo que necesitas...



Un saludo.

Chris 15-03-2013 17:41:55

Aunque la forma sugerida por Neftalí es valida, tengo otra alternativa.

Primero, establece la propiedad Style del CheckListBox a lbOwnerDrawFixed. Luego en el evento OnDrawItem utilizá un código similar a este:

Código Delphi [-]
procedure TForm2.CheckListBox1DrawItem(Control: TWinControl;
                                       Index: Integer;
                                       Rect: TRect; State: TOwnerDrawState);
var
    DrawingRect: TRect;
    DrawText: String;
begin
    DrawingRect := Rect;
    DrawText := TCheckListBox(Control).Items[Index];

    with TCheckListBox(Control).Canvas do
    begin
        if Index = 0 then // Condición para pintar elementos tachados
        begin
            Font.Style := [fsStrikeOut];
        end;

        FillRect(Rect);
        Inc(DrawingRect.Left, 3); // dejar 3px de margen entre el texto y el Checkbox
        TextRect(DrawingRect, DrawText);
    end;
end;

El código anterior tachará el texto del primer elemento de la lista.

Saludos.

maeyanes 15-03-2013 17:47:52

Hola...

También puedes usar la propiedad Style con el valor fsStrikeOut de la clase TFont y el evento OnDrawItem:

Código Delphi [-]
procedure TForm1.CheckListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState
var
  ItemStz: array [0..255] of Char;

begin
  with CheckListBox1.Canvas do
  begin
    Font.Assign(Self.Font);
    Brush.Color := CheckListBox1.Color;
    if CheckListBox1.Checked[Index] then
      Font.Style := [fsStrikeOut]
    else
      Font.Style := [];
    StrPCopy(ItemStz, CheckListBox1.Items[Index]);
    DrawText(Handle, ItemStz, -1, Rect, DT_WORDBREAK or DT_EXPANDTABS)
  end
end;



Tienes que poner la propiedad Style del componente en lbOwnerDrawFixed. También, como comenta Neftalí, hay que pulir algunas cosas.


Saludos...

P.D. Vaya, tuve la misma idea que Chris... :D :D :D

Neftali [Germán.Estévez] 15-03-2013 17:50:45

Cita:

Empezado por Chris (Mensaje 456899)
Aunque la forma sugerida por Neftalí es valida, tengo otra alternativa.

Buena.
En este caso te evitas derivar el componente. ^\||/

teecweb 15-03-2013 19:51:43

Holas..gracias por sus respuestas tamebin en innosetup se utiliza el fsStrikeOut como seria con un checkboxlist cada vez que chekea y despues presiona el boton para que aparezca el tachado..gracias por sus respuestas

ecfisa 15-03-2013 20:01:09

Hola.

Aunque no es muy diferente a los códigos anteriores (generalmente es así :)), otra variante:
Código Delphi [-]
procedure TForm1.CheckListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with Control as TCheckListBox do
  begin
    if Checked[Index] then
      Canvas.Font.Style:= [fsStrikeOut];
    FillRect(Canvas.Handle, Rect, Handle);
    DrawText(Canvas.Handle, PChar(Items[Index]), -1, Rect, DT_SINGLELINE);
  end;
end;

Saludos.

teecweb 15-03-2013 20:51:29

Holas ..gracis por su respuesta
asi agregue el codigo para el innosetup
Código Delphi [-]
//como ya recibo el inidice del checkbox chekeado que es i  y otra vez pregunto si esta chekeado...al compilarlo me sale que no reconoce canvas..gracias por tu respuesta:D
procedure checkboxlistDibujo(var i: integer);
begin
    if CheckListBox1.Checked[i] then
     Canvas.Font.Style:= [fsStrikeOut];
  end;
end;

maeyanes 15-03-2013 21:22:51

Hola...

Deberías indicar desde un principio que estás usando Pascal Script en InnoSetup, y esto es por que en Pascal Script no se tienen todas las características del lenguaje Delphi. Como por ejemplo, el acceso a la propiedad Canvas de las clases visuales integradas.

Explica un poco mejor que es lo que estás tratando de lograr desde tu instalador y tal vez se te pueda dar mejores soluciones.



Saludos...

ecfisa 15-03-2013 21:40:39

Hola.

Agregando algo a lo que te explica maeyanes (que no es lo mismo Delphi que Pascal Script), aquí: Pascal Scripting: Support Classes Reference, encontrarás los detalles de las clases soportadas.

Saludos.

teecweb 15-03-2013 21:53:13

Disculpa por no haberme explicado mejor..el codigo esta en innosetup
tengo una lista de cheboxlist y con un boton cada vez que que chekeo y hago click en el boton se tacha el item del checkboxlist ...aki tengo un codigo donde ya recibo el indice que chekeo.. en esta funcion el inidce es el i..el problema que cuando compilo me sale ke no reconoce canvas.

//como ya recibo el inidice del checkbox chekeado que es i y otra vez pregunto si esta chekeado...al compilarlo me sale que no reconoce canvas..gracias por tu respuesta..:D
Código Delphi [-]
procedure checkboxlistDibujo(var i: integer);
begin
    if CheckListBox1.Checked[i] then
     Canvas.Font.Style:= [fsStrikeOut];
  end;
end;

maeyanes 15-03-2013 21:59:16

Hola...

No estoy seguro de que esto funcione, pero podrías intentar algo así:

Código Delphi [-]
procedure StrokeOutItem(I: Integer);
begin
  if CheckListBox1.Checked[i] then
    with CheckListBox1.ItemObject[i] as TCheckBox do
      Font.Style := [fsStrikeOut]
end;


Saludos...

teecweb 16-03-2013 01:49:09

Holas..me sale error :

Código Delphi [-]
'DO' expected.

teecweb 17-03-2013 14:23:57

Holas en intentado de esta manera :
pero sale que no se puede llamar a ese procedimiento..gracias por sus respuesta
Código Delphi [-]
procedure checkboxlistDibujo(var i: integer);


begin
 with CheckListBox1.ItemObject[i] do
    begin
      tcheckbox(CheckListBox1.ItemObject[i]).Font.Style := [fsStrikeOut]
      end;
   
end;

teecweb 19-03-2013 01:02:33

Tachar un item del checkboxlist en inno setup
 
Holas tengo un checboxlist creado de forma dinamica y un boton ....al chekear el checkbolist y el presionar el boton me deberia aparecer tachado el check ckekeado segun los compañeros de este foro es con este codigo de abajo y esta bien si funciona si tacha..pero yo quiero solo items especificos del check..esdecir no se como recuperar el indice del checbokslist para que tache ese item seleccionado..gracias por respuestas...:D
Código Delphi [-]
.Font.Style := [fsStrikeOut]

maeyanes 19-03-2013 17:53:07

Hola...

Ya tienes un hilo abierto (Tachar una palabra en delphi) donde se te está respondiendo al respecto.

No creo que sea buena idea que abras otro hilo para tratar sobre el mismo tema.



Saludos...

ecfisa 19-03-2013 17:58:29

Cita:

Empezado por maeyanes (Mensaje 457082)
Hola...

Ya tienes un hilo abierto (Tachar una palabra en delphi) donde se te está respondiendo al respecto.

No creo que sea buena idea que abras otro hilo para tratar sobre el mismo tema.



Saludos...

Hola.

Ya combiné ambos hilos, gracias por señalarnoslo. ;)

Saludos. :)

maeyanes 19-03-2013 19:22:41

Hola...

Prueba de esta forma:

Código Delphi [-]
procedure StrokeOutItem(I: Integer);
begin
  if CheckListBox1.Checked[i] and (CheckListBox1.ItemObject[i] is TCheckBox) then
    TCheckBox(CheckListBox1.ItemObject[i]).Font.Style := [fsStrikeOut]
end;


Saludos...

teecweb 19-03-2013 23:44:56

Holas..gracias por la respuesta
lo que no reconoce este codigo ..sale este error en esta linea 'cool no call proc',..gracias por tus respuestas:o
Código Delphi [-]

TCheckBox(CheckListBox1.ItemObject[i]).Font.Style := [fsStrikeOut]

teecweb 21-03-2013 03:40:23

Por favor ....alguna respuesta..gracias:D


La franja horaria es GMT +2. Ahora son las 09:25:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi