Curso Delphi. Lección 05D  

Send By: Ariel Bustamante
Web : N.A.
Email: N.A.
Date: 30/12/02

Tip accessed 792 times

 


MenuEdicion

Diseño del Documento/Color de Fondo
if ColorDialog1.Execute then
RichEdit1.Color := ColorDialog1.Color;

Aquí simplemente ejecutamos a ColorDialog y el color que el usuario seleccione en el, será el color de fondo del RichEdit.

Diseño del Documento/Fuente de Letra

 FontDialog1.Execute;
 RichEdit1.Font := FontDialog1.Font;



Ejecutamos el FontDialog y asignamos al RichEdit el tipo, color, tamaño y estilo de letra seleccionado en él.

Diseño del Documento/Alineación del Texto/A la Izquierda
Diseño del Documento/Alineación del Texto/Centrado
Diseño del Documento/Alineación del texto/A la Derecha

A estos tres menús le escribiremos la misma sintaxis que a los SpeedButtons de alineación.

Copiar

 RichEdit1.CopyToClipBoard;
 Cortar
 RichEdit1.CutToClipboard;
 Pegar
 RichEdit1.PasteFromClipBoard;
 Seleccionar todo
 RichEdit1.SelectAll;
 Borrar
 RichEdit1.Clear;



MenuBusqueda

Buscar/Buscar un texto

 FindDialog1.Execute;



Aquí simplemente ejecutamos el FindDialog, pero para su funcionamiento debemos escribir en su Evento/OnFind:
Antes del begin escribe:

 var
   FoundAt: LongInt;
   StartPos, ToEnd: Integer;




Y después del begin:

   with RichEdit1 do
   begin

     if SelLength <> 0 then

       StartPos := SelStart + SelLength
     else

       StartPos := 0;

       ToEnd := Length(Text) - StartPos;

     FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
     if FoundAt <> -1 then
     begin
       SetFocus;
       SelStart := FoundAt;
       SelLength := Length(FindDialog1.FindText);
     end;
   end;



Ten presente que todas las variables (var) que declares dentro de un procedimiento (procedure) van antes del begin. Aquí por ejemplo se declararon dos variables del tipo Integer (número entero) para ello solo basta con separarlas con una coma y en un mismo párrafo se pueden escribir dos o más variables.

Buscar/Remplazar un texto

 ReplaceDialog1.Execute;



Aquí hemos procedido como en FindDialog y en su Evento/OnReplace escribimos antes del begin


 var
   SelPos: Integer;

 Después del begin

   with TReplaceDialog(Sender) do
   begin
    SelPos := Pos(FindText, RichEdit1.Lines.Text);
     if SelPos > 0 then
     begin
       RichEdit1.SelStart := SelPos - 1;
       RichEdit1.SelLength := Length(FindText);
       RichEdit1.SelText := ReplaceText;
     end
     else MessageDlg(Concat('Texto no encontrado "', FindText, '" '), mtError, [mbOk], 0);
 end;



MenuImpresión

Configurar Impresora

 PrinterSetupDialog1.Execute;



Imprimir

 if PrintDialog1.Execute then
     RichEdit1.Print(FFileName);



MenuAyuda

Acerca de..

 FAcerca.Show;



Ayuda
Este te lo dejo por tu cuenta, pero no sin antes darte alguna pista para diseñar un menú de ayuda simple pero efectivo. Yo agregaría una Form y en ella
pondría un Tmemo en cuyo Lines Editor escribiría el texto de ayuda. Llamaría a la Form con el Evento/OnClick del menú Ayuda y la quitaría simplemente con el aspa de cerrado o con un Button. Si tienes alguna duda consulta haz una consulta en la página de la lección.
RichEdit1/Evento/OnKeyDown:


 StatusBar1.panels[1].Text := 'Editando';



Al presionar cualquier tecla el segundo panel de StatusBar nos mostrará este texto. Y por ejemplo al menú Búsqueda/Buscar/Remplazar un Texto le podríamos poner:


 StatusBar1.panels[1].Text := 'Remplazando un texto';



Y así sucesivamente lo debemos hacer con todos los eventos OnClick para que la información se actualice constantemente. Yo lo hice solo con estos dos, el
resto es vuestro. Ahora para concluir con los Panels vamos a darle una función al Panel[0], utilizando el Timer7 de UnitCaratula. Ve a Fcaratula, busca en el inspector a Timer7, clica sobre Events/OnTimer y en la Unit al final de todo el código que ya tiene escrito pon:


 FEditor.StatusBar1.panels[0].Text := TimeToStr(time);



Fíjate que no podemos comenzar la sintaxis con StatusBar1.panels[0].Text := TimeToStr(time); porque FCaratula no tiene ningún StatusBar y al compilar nos indicaría ese error, por eso delante ponemos FEditor.StatusBar1, o sea que primero le indicamos donde se encuentra StatusBar, esta aparentemente simple explicación, tenla muy en cuenta cuando quieras trabajar entre varias Forms, si el componente no se encuentra en la Form asociada a la Unit en la cual estás redactando el código, haz de mencionar donde está antes de mencionar al componente en cuestión. Como esta es la primera mención a FEditor que hacemos desde Fcarátula al compilar aparecerá el aviso de siempre que debemos contestar con Yes.
NOTA DEL AUTOR
Aquí doy por acabado este editor de textos que nos ha hecho conocer una infinidad de componentes nuevos, en definitiva la intención era esa, trabajar amenamente con nuevos componentes y sus respectivos códigos. Te puedo asegurar que tú eres capaz de mejorar y sofisticar muy mucho este editor, busca en los trucos de Trucomanía, hay varios trucos para RichEdit y otros para ampliar las funciones de cualquier editor como por ejemplo seguir con el menú poniendo opciones de Internet ccomo abrir el explorador o el OutLook desde el programa (trucos 83 y 95) etc. Anímate que ya tienes nivel para realizar por ti solo/a muchos trucos y códigos, practícalos todos por más facil que te parezca, lo que de comienzo nos puede parecer una tontería, te puedo asegurar que siempre esconde algo que por tan tonto no lo sabíamos. Otro método autodidacta es variar las propiedades de los componentes y ver que cambios se producen sobre el mismo.
Por razones profesionales de su autor esta continuación de la Lección 5 se ha atrasado más de lo debido, por tanto dejamos el bloque de teoría para la Lección 6 donde tocaremos el tema del escritorio de Delphi, varios conceptos teóricos, algunos componentes y diseñaremos nuestra primera Tabla Parados.

Ariel Bustamante para Trucomanía.

A continuación el código fuente de lo realizado hasta aquí


 unit UnitAcerca;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, Buttons;

 type
   TFAcerca = class(TForm)
     BitBtn1: TBitBtn;
     Label1: TLabel;
     Label2: TLabel;
     Label3: TLabel;
     Label4: TLabel;
     procedure BitBtn1Click(Sender: TObject);
     procedure FormCreate(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   FAcerca: TFAcerca;

 implementation

 uses UnitCaratula;

 {$R *.DFM}

 procedure TFAcerca.BitBtn1Click(Sender: TObject);
 begin
 Close;

 end;

 procedure TFAcerca.FormCreate(Sender: TObject);

 var Porcentaje : LongInt;
      MS        : TMemoryStatus;
 begin
 Porcentaje := DiskFree(0) div (DiskSize (0) div 100);
 Label2.Caption := IntToStr (DiskFree(0) div 1024000)
                    + ' Mb (' + IntToStr(Porcentaje) + ' %)';
 GlobalMemoryStatus (MS);
 Label4.Caption := IntToStr (MS.dwTotalPhys) + '  bytes total,   '
                  + IntToStr (MS.dwAvailPhys) + 'bytes libre';

 end;

 end.

 unit UnitEditor;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   Menus, ComCtrls, ExtCtrls, StdCtrls, Buttons;

 type
   TFEditor = class(TForm)
     MainMenu1: TMainMenu;
     MenuArchivo: TMenuItem;
     Nuevo1: TMenuItem;
     Abrir1: TMenuItem;
     N1: TMenuItem;
     Guardar1: TMenuItem;
     Guardarcomo1: TMenuItem;
     N2: TMenuItem;
     salir1: TMenuItem;
     MenuEdicion: TMenuItem;
     Copiar1: TMenuItem;
     Cortar1: TMenuItem;
     Pegar1: TMenuItem;
     N3: TMenuItem;
     SeleccionarTodo1: TMenuItem;
     N4: TMenuItem;
     Borrar1: TMenuItem;
     MenuBusqueda: TMenuItem;
     Buscar1: TMenuItem;
     Buscaruntexto1: TMenuItem;
     Remplazaruntexto1: TMenuItem;
     MenuAyuda: TMenuItem;
     Acercade1: TMenuItem;
     Ayuda2: TMenuItem;
     Panel1: TPanel;
     StatusBar1: TStatusBar;
     RichEdit1: TRichEdit;
     SPNegrita: TSpeedButton;
     SPCursiva: TSpeedButton;
     SPSubrayada: TSpeedButton;
     SPTachada: TSpeedButton;
     SPIzquierda: TSpeedButton;
     SPCentro: TSpeedButton;
     SPDerecha: TSpeedButton;
     MenuImpresion: TMenuItem;
     ConfigurarImpresora1: TMenuItem;
     Imprimir1: TMenuItem;
     Fuentes1: TMenuItem;
     N5: TMenuItem;
     ColordeFondo1: TMenuItem;
     N6: TMenuItem;
     FuentedeLetra1: TMenuItem;
     N7: TMenuItem;
     AlineacinalaIzquierda1: TMenuItem;
     AlaIzquierda1: TMenuItem;
     Centrado1: TMenuItem;
     AlaDerecha1: TMenuItem;
     FontDialog1: TFontDialog;
     SPNormal: TSpeedButton;
     BitBtn1: TBitBtn;
     PrintDialog1: TPrintDialog;
     PrinterSetupDialog1: TPrinterSetupDialog;
     FindDialog1: TFindDialog;
     ReplaceDialog1: TReplaceDialog;
     ColorDialog1: TColorDialog;
     OpenDialog1: TOpenDialog;
     SaveDialog1: TSaveDialog;
     procedure FormActivate(Sender: TObject);
     procedure salir1Click(Sender: TObject);
     procedure Acercade1Click(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FuentedeLetra1Click(Sender: TObject);
     procedure SPIzquierdaClick(Sender: TObject);
     procedure SPCentroClick(Sender: TObject);
     procedure SPDerechaClick(Sender: TObject);
     procedure SPNegritaClick(Sender: TObject);
     procedure SPCursivaClick(Sender: TObject);
     procedure SPSubrayadaClick(Sender: TObject);
     procedure SPTachadaClick(Sender: TObject);
     procedure SPNormalClick(Sender: TObject);
     procedure BitBtn1Click(Sender: TObject);
     procedure Nuevo1Click(Sender: TObject);
     procedure Abrir1Click(Sender: TObject);
     procedure Guardar1Click(Sender: TObject);
     procedure Guardarcomo1Click(Sender: TObject);
     procedure ColordeFondo1Click(Sender: TObject);
     procedure AlaIzquierda1Click(Sender: TObject);
     procedure Centrado1Click(Sender: TObject);
     procedure AlaDerecha1Click(Sender: TObject);
     procedure Copiar1Click(Sender: TObject);
     procedure Cortar1Click(Sender: TObject);
     procedure Pegar1Click(Sender: TObject);
     procedure SeleccionarTodo1Click(Sender: TObject);
     procedure Borrar1Click(Sender: TObject);
     procedure FindDialog1Find(Sender: TObject);
     procedure Buscaruntexto1Click(Sender: TObject);
     procedure ReplaceDialog1Replace(Sender: TObject);
     procedure Remplazaruntexto1Click(Sender: TObject);
     procedure ConfigurarImpresora1Click(Sender: TObject);
     procedure Imprimir1Click(Sender: TObject);
     procedure RichEdit1KeyDown(Sender: TObject; var Key: Word;
       Shift: TShiftState);


   private

    FFileName: String;
    procedure SetFileName(const FileName: String);

   public
     { Public declarations }
   procedure DisplayHint (Sender: TObject);

   end;

 var
   FEditor: TFEditor;

 implementation

 uses UnitPassword, UnitCaratula, UnitAcerca;

 {$R *.DFM}

 procedure TFEditor.DisplayHint(Sender: TObject);
 begin
 StatusBar1.panels[2].Text := Application.Hint;
 end;

 procedure TFEditor.SetFileName(const FileName: String);
 begin
   FFileName := FileName;
   Caption := Format('%s - %s', [ExtractFileName(FileName), Application.Title]);
 end;

 procedure TFEditor.FormActivate(Sender: TObject);
 begin
 FPassword.Visible := False;

 end;

 procedure TFEditor.salir1Click(Sender: TObject);
 begin
 FCaratula.Show;
 end;

 procedure TFEditor.Acercade1Click(Sender: TObject);
 begin
 FAcerca.Show;
 end;

 procedure TFEditor.FormCreate(Sender: TObject);
 begin

 Application.OnHint := DisplayHint;
 end;


 procedure TFEditor.FuentedeLetra1Click(Sender: TObject);
 begin
 FontDialog1.Execute;
 RichEdit1.Font := FontDialog1.Font;
 end;

 procedure TFEditor.SPIzquierdaClick(Sender: TObject);
 begin
 RichEdit1.Paragraph.Alignment := taLeftJustify;
 end;

 procedure TFEditor.SPCentroClick(Sender: TObject);
 begin
 RichEdit1.Paragraph.Alignment := taCenter;
 end;

 procedure TFEditor.SPDerechaClick(Sender: TObject);
 begin
 RichEdit1.Paragraph.Alignment :=  taRightJustify;
 end;

 procedure TFEditor.SPNegritaClick(Sender: TObject);
 begin
 RichEdit1.Font.Style := [fsBold];
 SPNormal.Down := False;
 end;

 procedure TFEditor.SPCursivaClick(Sender: TObject);
 begin
 RichEdit1.Font.Style := [fsItalic] ;
 SPNormal.Down := False;
 end;

 procedure TFEditor.SPSubrayadaClick(Sender: TObject);
 begin
 RichEdit1.Font.Style := [fsUnderline] ;
 SPNormal.Down := False;
 end;

 procedure TFEditor.SPTachadaClick(Sender: TObject);
 begin
 RichEdit1.Font.Style := [fsStrikeOut] ;
 SPNormal.Down := False;
 end;

 procedure TFEditor.SPNormalClick(Sender: TObject);
 begin
 RichEdit1.Font.Style := [] ;
 SPNegrita.Down := False;
 SPCursiva.Down := False;
 SPTachada.Down := False;
 SPSubrayada.Down := False;
 end;

 procedure TFEditor.BitBtn1Click(Sender: TObject);
 begin
 Close;
 end;

 procedure TFEditor.Nuevo1Click(Sender: TObject);
 begin
 RichEdit1.Clear;
 end;


 procedure TFEditor.Abrir1Click(Sender: TObject);
 begin
 OpenDialog1.Execute;
  if OpenDialog1.Execute then
   begin
     RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
 end;
 end;
 procedure TFEditor.Guardar1Click(Sender: TObject);
 begin
  RichEdit1.Lines.SaveToFile(FFileName);
 end;

 procedure TFEditor.Guardarcomo1Click(Sender: TObject);

 begin
   if SaveDialog1.Execute then
   begin
     if FileExists(SaveDialog1.FileName) then
       if MessageDlg(Format('Sobrescribir %s', [SaveDialog1.FileName]),
         mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit;
     RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
     SetFileName(SaveDialog1.FileName);
 end;
  end;
 procedure TFEditor.ColordeFondo1Click(Sender: TObject);
 begin
 if ColorDialog1.Execute then
 RichEdit1.Color := ColorDialog1.Color;
 end;

 procedure TFEditor.AlaIzquierda1Click(Sender: TObject);
 begin
  RichEdit1.Paragraph.Alignment :=  taLeftJustify;
 end;

 procedure TFEditor.Centrado1Click(Sender: TObject);
 begin
 RichEdit1.Paragraph.Alignment :=  taCenter;
 end;

 procedure TFEditor.AlaDerecha1Click(Sender: TObject);
 begin
 RichEdit1.Paragraph.Alignment :=  taRightJustify;
 end;

 procedure TFEditor.Copiar1Click(Sender: TObject);
 begin
 RichEdit1.CopyToClipBoard;
 end;

 procedure TFEditor.Cortar1Click(Sender: TObject);
 begin
 RichEdit1.CutToClipboard;
 end;

 procedure TFEditor.Pegar1Click(Sender: TObject);
 begin
 RichEdit1.PasteFromClipBoard;
 end;

 procedure TFEditor.SeleccionarTodo1Click(Sender: TObject);
 begin
 RichEdit1.SelectAll;
 end;

 procedure TFEditor.Borrar1Click(Sender: TObject);
 begin
 RichEdit1.Clear;
 end;

 procedure TFEditor.FindDialog1Find(Sender: TObject);
 var
   FoundAt: LongInt;
   StartPos, ToEnd: Integer;
 begin
   with RichEdit1 do
   begin

     if SelLength <> 0 then

       StartPos := SelStart + SelLength
     else

       StartPos := 0;

       ToEnd := Length(Text) - StartPos;

     FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
     if FoundAt <> -1 then
     begin
       SetFocus;
       SelStart := FoundAt;
       SelLength := Length(FindDialog1.FindText);
     end;
   end;
 end;
 procedure TFEditor.Buscaruntexto1Click(Sender: TObject);
 begin
   FindDialog1.Execute;

 end;

 procedure TFEditor.ReplaceDialog1Replace(Sender: TObject);

 var
   SelPos: Integer;
 begin
   with TReplaceDialog(Sender) do
   begin
    SelPos := Pos(FindText, RichEdit1.Lines.Text);
     if SelPos > 0 then
     begin
       RichEdit1.SelStart := SelPos - 1;
       RichEdit1.SelLength := Length(FindText);
       RichEdit1.SelText := ReplaceText;
     end
     else MessageDlg(Concat('Texto no encontrado "', FindText, '" '), mtError, [mbOk], 0);
 end;
  end;
 procedure TFEditor.Remplazaruntexto1Click(Sender: TObject);
 begin
 ReplaceDialog1.Execute;
 StatusBar1.panels[1].Text := 'Remplazando un texto';

 end;

 procedure TFEditor.ConfigurarImpresora1Click(Sender: TObject);
 begin
 PrinterSetupDialog1.Execute;
 end;

 procedure TFEditor.Imprimir1Click(Sender: TObject);
 begin
   if PrintDialog1.Execute then
     RichEdit1.Print(FFileName);
 end;



 procedure TFEditor.RichEdit1KeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
 begin
   StatusBar1.panels[1].Text := 'Editando';
 end;


 end.


 El único bloque modificado de UnitCarátula

 procedure TFCaratula.Timer7Timer(Sender: TObject);
 begin
 LTitulo1.Font.Size := 72;
 LTitulo2.Font.Size := 72;
 LTitulo2.Visible := True;
 FCaratula.Color := clBlue;
 LHora.Caption := TimeToStr(time); //pasamos el valor Time a (to) Str (string) así lo puede recoger el Caption de la Label
 LDia.Caption := DateToStr(date);   //ahora nos mostrará la fecha.
 LHora.Visible := True;
 LDia.Visible := True;
 Timer6.Enabled := False;
 MediaPlayer1.Stop;
 Label1.Visible := True;
 Label2.Visible := True;
 Label3.Visible := True;
 FEditor.StatusBar1.panels[0].Text := TimeToStr(time);


 end;