PDA

Ver la Versión Completa : Editor de texto se tilda


Nicolas_2011
28-11-2011, 21:11:10
buenas gente tengo un problemita con un editor de texto, el tema es que cuando abro un archivo si es que el mismo es muy extenso por ejemplo el que tengo abierto en este momento tiene mas de 220 lineas y mas de 15500 letras se tilda..osea se queda muerto durante varios segundos y reacciona intento hacer cualquier cosa con el texto(ej cambiale color de letras subrayar en fin.. cualquier cosa) y se tilda de nuevo, esto no ocurre con textos pequeños.. alguien sabe porque y sabe la solucion? si necesitan ver el codigo me dicen y lo posteo

ecfisa
28-11-2011, 21:22:26
Hola Nicolas.

si necesitan ver el codigo me dicen y lo posteo

Sería un buen comienzo, de otro modo no veo la posibilidad de averiguar que está sucediendo...


Saludos.

Nicolas_2011
28-11-2011, 21:25:23
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ComCtrls, StdCtrls, ToolWin, Menus, jpeg, ExtCtrls, Printers,
Buttons;

type
TForm1 = class(TForm)
Feditor: TMainMenu;
editor: TRichEdit;
Dabrir: TOpenDialog;
Dguardar: TSaveDialog;
Dfuentes: TFontDialog;
barradeestado: TStatusBar;
barraarchivo: TToolBar;
listaimagenes: TImageList;
Nuevo1: TMenuItem;
Abrir1: TMenuItem;
Guardar1: TMenuItem;
Nuevo2: TMenuItem;
Cerrar1: TMenuItem;
Edicion1: TMenuItem;
Copiar1: TMenuItem;
Cortar1: TMenuItem;
Pegar1: TMenuItem;
N2: TMenuItem;
Fuente1: TMenuItem;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
Izquierda: TToolButton;
centro: TToolButton;
Derecha: TToolButton;
PopupMenu1: TPopupMenu;
Pegar2: TMenuItem;
Cortar2: TMenuItem;
N3: TMenuItem;
Fuente2: TMenuItem;
Copiar2: TMenuItem;
Propiedades1: TMenuItem;
Alineacion1: TMenuItem;
Izquierda1: TMenuItem;
Centro1: TMenuItem;
Derecha1: TMenuItem;
N4: TMenuItem;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
ToolButton10: TToolButton;
ToolButton11: TToolButton;
Fuente3: TMenuItem;
Ayuda1: TMenuItem;
Imprimir1: TMenuItem;
N1: TMenuItem;
Image1: TImage;
ToolButton12: TToolButton;
ToolButton13: TToolButton;
PrintDialog1: TPrintDialog;
FindDialog1: TFindDialog;
ReplaceDialog1: TReplaceDialog;
Buscar1: TMenuItem;
Reemplazar1: TMenuItem;
procedure Abrir1Click(Sender: TObject);
procedure Guardar1Click(Sender: TObject);
procedure Nuevo2Click(Sender: TObject);
procedure Copiar1Click(Sender: TObject);
procedure Cortar1Click(Sender: TObject);
procedure Pegar1Click(Sender: TObject);
procedure Fuente1Click(Sender: TObject);
procedure IzquierdaClick(Sender: TObject);
procedure centroClick(Sender: TObject);
procedure DerechaClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure ToolButton6Click(Sender: TObject);
procedure ToolButton7Click(Sender: TObject);
procedure ToolButton8Click(Sender: TObject);
procedure editorSelectionChange(Sender: TObject);
procedure ToolButton11Click(Sender: TObject);
function nrocaracteres(editor: TRichEdit): integer;
procedure ToolButton12Click(Sender: TObject);
procedure ToolButton13Click(Sender: TObject);
procedure FindDialog1Find(Sender: TObject);
procedure ReplaceDialog1Find(Sender: TObject);
procedure ReplaceDialog1Replace(Sender: TObject);
procedure editorKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i,c,a,ban:integer ;
implementation

{$R *.dfm}

procedure TForm1.Abrir1Click(Sender: TObject); //boton abrir
begin
If Dabrir.Execute then
editor.Lines.LoadFromFile(Dabrir.FileName);
end;

procedure TForm1.Guardar1Click(Sender: TObject); //boton guardar
begin
If Dguardar.Execute then
editor.Lines.SaveToFile(Dguardar.FileName);
end;

procedure TForm1.Nuevo2Click(Sender: TObject); //boton nuevo
begin
If editor.Text <> '' then
if application.MessageBox('¿Desea Guardar El Texto Actual?', 'ATENCION', MB_ICONQUESTION OR MB_YESNO)= ID_YES THEN
Guardar1Click(Self);
editor.clear;
end;

procedure TForm1.Copiar1Click(Sender: TObject); //copiar
begin
editor.CopyToClipboard;
end;

procedure TForm1.Cortar1Click(Sender: TObject); //cortar
begin
editor.CutToClipboard;
end;

procedure TForm1.Pegar1Click(Sender: TObject); //pegar
begin
editor.PasteFromClipboard;
end;

procedure TForm1.Fuente1Click(Sender: TObject); //fuente
begin
If Dfuentes.Execute then
editor.SelAttributes.Name := Dfuentes.Font.Name;
editor.SelAttributes.Color := Dfuentes.Font.Color;
editor.SelAttributes.Style := Dfuentes.Font.Style;
editor.SelAttributes.Size := Dfuentes.Font.Size;
end;

procedure TForm1.IzquierdaClick(Sender: TObject); //justificado izquierda
begin
editor.Paragraph.Alignment := taLeftJustify;
end;

procedure TForm1.centroClick(Sender: TObject); //justificado centro
begin
editor.Paragraph.Alignment := taCenter;
end;

procedure TForm1.DerechaClick(Sender: TObject); //justificado derecha
begin
editor.Paragraph.Alignment := taRightJustify;
end;


procedure TForm1.FormActivate(Sender: TObject);
begin
c:=0;
//Fila y columna
barradeestado.Panels[0].Text := Format('Fila: %d Columna: %d', [editor.CaretPos.y+1, editor.CaretPos.X+1]);

//lineas
barradeestado.Panels[1].Text := IntToStr(editor.Lines.Count);

// contar palabras
for I := 1 to Length(editor.Text) do
if pos(editor.Text[i],'')> 0 then
Inc(c);
barradeestado.Panels[2].Text:= IntToStr(c);
// contar caracteres
barradeestado.Panels[3].Text := 'Letras: '+ IntToStr(NroCaracteres(editor));
end;

procedure TForm1.editorSelectionChange(Sender: TObject);
begin
c:=0;
barradeestado.Panels[0].Text := Format('Fila: %d Columna: %d', [editor.CaretPos.y+1, editor.CaretPos.X+1]);
barradeestado. Panels[1].Text := 'Lineas:'+' ' + IntToStr(editor.Lines.Count); // Contar lineas
for I := 1 to Length(editor.Text) do // contar palabras
if pos(editor.Text[i],'')> 0 then
Inc(c);
barradeestado.Panels[2].Text:=IntToStr(c);
//caracteres
barradeestado.Panels[3].Text := 'Letras: '+ IntToStr(NroCaracteres(editor));
end;

procedure TForm1.ToolButton5Click(Sender: TObject); // negrita
begin
With editor.SelAttributes do
if ( fsBold in Style ) then
Style := Style-[FSBOLD] else
Style := Style+[FSBOLD];
end;

procedure TForm1.ToolButton6Click(Sender: TObject); //cursiva
begin
With editor.SelAttributes do
if ( fsItalic in Style ) then
Style := Style-[fsItalic] else
Style := Style+[fsItalic];
end;


procedure TForm1.ToolButton7Click(Sender: TObject); //Subrayado
begin
With editor.SelAttributes do
if ( fsunderline in Style ) then
Style := Style-[fsunderline] else
Style := Style+[fsunderline];
end;


procedure TForm1.ToolButton8Click(Sender: TObject); //tachada
begin
With editor.SelAttributes do
if ( fsstrikeout in Style ) then
Style := Style-[fsstrikeout] else
Style := Style+[fsstrikeout];
end;




procedure TForm1.ToolButton11Click(Sender: TObject); //Imprimir
var
i, x, y, h :integer;
begin
if not PrintDialog1.Execute then ShowMessage('La impresion fue cancelada')
else
with Printer do
begin
BeginDoc;
x:= 10; y:=60;
h:= Canvas.TextHeight('T')+1;
For i:=0 to editor.Lines.Count-1 do
begin
canvas.TextOut(x,y,editor.Lines[i]);
inc(y,h);
end;
EndDoc;
end;
end;

function Tform1.nrocaracteres(editor: TRichEdit): integer; //funcion caracteres
var
i:integer;
begin
Result:=0;
for i:=1 to length (editor.Text) do
if UpCase(editor.text[i]) <> ' ' then
Inc(Result);
end;

/////////////
procedure TForm1.ToolButton12Click(Sender: TObject);
begin
finddialog1.Execute;
end;

procedure TForm1.ToolButton13Click(Sender: TObject);
begin
replacedialog1.Execute;
ban:=0;
end;

procedure TForm1.FindDialog1Find(Sender: TObject); //proc buscar
begin
a:=0;
a:=editor.FindText(finddialog1.FindText, 0, length(editor.text), [stmatchcase]);
if (a>-1) then
begin
editor.SetFocus;
editor.selstart:=a;
editor.sellength:=length(finddialog1.findtext);
end
else
messagedlg('No se encontró el texto buscado',mtinformation, [mbok], 0);
end;

procedure TForm1.ReplaceDialog1Find(Sender: TObject);
begin
a:=0;
a:=editor.FindText(replacedialog1.FindText, 0, length(editor.text), [stmatchcase]);
if (a>-1) then
begin
editor.SetFocus;
editor.selstart:=a;
editor.sellength:=length(replacedialog1.findtext);
end
else
messagedlg('No se encontró el texto buscado',mtinformation, [mbok], 0);
end;


procedure TForm1.ReplaceDialog1Replace(Sender: TObject);//PROC REEMP/REEMP
begin
if (a>-1) and (ban=0)then
begin
ban:=1;
a:=editor.FindText(replacedialog1.FindText, 0, length(editor.text), [stmatchcase]);
editor.SetFocus;
editor.selstart:=a;
editor.sellength:=length(replacedialog1.findtext);
editor.SelText:=replacedialog1.ReplaceText;
end
else
messagedlg('No se encontró texto para reemplazar',mtinformation, [mbok], 0);
end;

procedure TForm1.editorKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_CONTROL then
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
end;


procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key = VK_CONTROL then
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

end;
end.

Nicolas_2011
28-11-2011, 21:27:46
Listo, ahi esta perdon..

Nicolas_2011
28-11-2011, 21:31:18
si lo se amigo, perdon como dije se me fue el dedo, disculpas

Casimiro Notevi
28-11-2011, 21:34:26
Has sido más rápido que yo en borrar mi mensaje :)

ecfisa
28-11-2011, 22:28:27
Hola Nicolás.

Estuve mirando el código e indudablemente el por qué de ese comportamiento se encuentra en el evento OnActivate, más exáctamente en este código:

...
// contar palabras
for I := 1 to Length(RichEdit1.Text) do
if pos(RichEdit1.Text[i],'')> 0 then
Inc(c);
barradeestado.Panels[2].Text:= IntToStr(c);
// contar caracteres
barradeestado.Panels[3].Text := 'Letras: '+ IntToStr(NroCaracteres(RichEdit1));
...

Esas dos, no són taréas rápidas si se trata con archivos muy grandes. ;)

Para probar lo que te comento, sólo encerra entre llaves las líneas como en el siguiente codigo y ejecutalo:

procedure TForm1.FormActivate(Sender: TObject);
var
i: Integer;
begin
barradeestado.Panels[0].Text := Format('Fila: %d Columna: %d',
[RichEdit1.CaretPos.y+1, RichEdit1.CaretPos.X+1]);
//lineas
barradeestado.Panels[1].Text := IntToStr(RichEdit1.Lines.Count);
{
// contar palabras
for I := 1 to Length(RichEdit1.Text) do
if pos(RichEdit1.Text[i],'')> 0 then
Inc(c);
barradeestado.Panels[2].Text:= IntToStr(c);
// contar caracteres
barradeestado.Panels[3].Text := 'Letras: '+ IntToStr(NroCaracteres(RichEdit1));
}
end;


Saludos.

Nicolas_2011
28-11-2011, 22:44:56
Muy bien ahora lo pruebo, una pregunta mas, pregunto esto porque no tengo idea ya que nuestro profesor no nos explico tdavia estos comportamientos, si reviste el codigo habras visto que en el items NUEVO se ejecuta un mensaje si desea guardar el archivo.. etc etc. ahora como hago ese evento pero si se preciona el boton cerrar.. el de windows no se como se llama jaja la X de la parte superior derecha..

ecfisa
28-11-2011, 22:56:10
Hola.

Para cerrar el form sólo es necesario llamar al procedimiento Close del mismo:

procedure TForm1.btnCerrarClick(Sender: TObject);
begin
Close;
end;


Saludos.

Nicolas_2011
28-11-2011, 23:02:15
Gracias =D