PDA

Ver la Versión Completa : Tachar una palabra en delphi


teecweb
15-03-2013, 14:57:53
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:


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:


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...

http://img15.imageshack.us/img15/521/imagen345.png

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:

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:


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 then
Font.Style := [fsStrikeOut]
else
Font.Style := [];
StrPCopy(ItemStz, CheckListBox1.Items[Index]);
DrawText(Handle, ItemStz, -1, Rect, DT_WORDBREAK or DT_EXPANDTABS)
end
end;


http://i1215.photobucket.com/albums/cc520/Ahau_Kin/Foros/ChecListBoxStrokeOut.png

Tienes que poner la propiedad Style del componente en [i]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
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:

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

//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 (http://www.jrsoftware.org/ishelp/index.php?topic=scriptclasses), 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

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í:


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 :

'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

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
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

.Font.Style := [fsStrikeOut]

maeyanes
19-03-2013, 17:53:07
Hola...

Ya tienes un hilo abierto (Tachar una palabra en delphi (http://www.clubdelphi.com/foros/showthread.php?t=82531)) 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
Hola...

Ya tienes un hilo abierto (Tachar una palabra en delphi (http://www.clubdelphi.com/foros/showthread.php?t=82531)) 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:


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


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

teecweb
21-03-2013, 03:40:23
Por favor ....alguna respuesta..gracias:D