Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Editor de texto. (https://www.clubdelphi.com/foros/showthread.php?t=53672)

rauros 26-02-2008 23:05:51

Editor de texto.
 
Saludillos. Me gustaría hacer un editor de textos cutre, he ir implementando le mejoras como resalte de código y contador de lineas. Pero de momento lo más sencillo posible. Una ventana en la que aparezca un cuadrado en el que poder escribir. Poder guardar lo que escribo en .txt, y poder cargar archivos .txt . Saludillos y gracias.

dec 26-02-2008 23:17:10

Hola,

Me pregunto, ¿qué problema tienes? ¿Necesitas alguna orientación o algo?

jachguate 26-02-2008 23:17:34

Bueno, no dejas ninguna pregunta puntual.

Delphi trae un demo que es un editor de texto. Mirá tu carpeta demos.

Hasta luego.

;)

ixMike 27-02-2008 00:02:42

Así empecé yo :rolleyes: qué recuerdos...

Tranquilo, superar al bloc de notas es sencillo. Quizá sólo te falte Unicode.

Es curioso cómo dec ha sido el primero en contestar. xEditor, ¿dónde se descarga?

Yo esperaba que te recomendara los SynEdit, o su variante Unicode, pero si quieres hacerlo sencillo, mira ese ejemplo que comenta jachguate, está bastante bien (pero no lo copies, que tiene copyright de Borland... CodeGear).

Así empecé yo... y nunca llegué a acabarlo del todo, pero sí que tuvo importantes funcionalidades extra (a ver si un día lo retomo y lo termino).


Salu2 :)

dec 27-02-2008 00:19:17

Hola,

En el Directorio del ClubDelphi he dejado el código fuente de XEditor, dentro de la carpeta "Ejemplos", aunque será más bien el ejemplo de cómo no hay que hacer las cosas. :D :D

dec 27-02-2008 00:25:50

Hola,

Acabo de subir al mismo lugar otro de "mis editores", Editor HTML. En este caso he subido el código fuente y la última versión del mismo (compilada). Es anterior a XEditor, así que os podéis hacer una idea de lo malo que será. :D :D :D

PD. Voy a cerrar la carpeta "Proyectos", porque, seguró que encontraría otras cosa igual de horripilantes. :D :D :D

rauros 27-02-2008 15:06:07

Vale. Voy a usar el ejemplo de delphi 7. Empezaré por lo más sencillo, que es poner un recuadro de texto, e iré intentado hacer que funcione bien (que baje de reglón con el botón enter, y todas esas cosas). Cuando termine os mandaré los errores que seguro seguriiisimo que voy a tener. Saludillos y gracias a todos por la ayuda que me dais, me habéis dado y me daréis.

rauros 27-02-2008 16:14:07

Okey. Ahora no puedo grabar archivos. Necesito más datos sobre SaveDialog porque no se como funciona. Para que funcione grabando/cargando archivos .txt .scp . Gracias de antemano. (ahora cuando me canse de investigar subo el código)

dec 27-02-2008 16:18:20

Hola,

¿No cuentas con la ayuda de Delphi? En ella tienes todo lo que te pueden ofrecer los componentes, como el "TSaveDialog" que mencionas...

rauros 27-02-2008 16:50:54

Más que leo y más que leo pero no encuentro lo que quiero. ¿Alguna ayuda?

rauros 27-02-2008 17:26:45

Solo pido un ejemplo de como funciona SaveDialog. Porque no hago más que darle vueltas al text rich este que viene de ejemplo y no encontrar ninguna respuesta. :confused: Por favor y gracias muchísimas gracias de antemano.

El ejemplo que necesitaría (está claro que así no sería):

Código:

savedialog.execute;
filetosave(txt,richedit1.strings);

Mi ejemplo se basa (o por lo menos eso intento) en que lo que haya escrito dentro de un richedit (¿¿¿es strigns???) se guarde en un archivo de texto.

dec 27-02-2008 17:30:28

Hola,

Código Delphi [-]

begin  
  if SaveDialog1.Execute then begin
    RichEdit1.SaveToFile(SaveDialog1.FileName);
  end;
end;

rauros 27-02-2008 18:01:21

No puedo usar procedure SaveToFile con richedit...

rauros 27-02-2008 18:15:39

Bueno, me voy. Luego vuelvo. Os dejo el código de lo que he conseguido hasta ahora.

Objetos:

Código Delphi [-]
object Form1: TForm1
  Left = 302
  Top = 239
  Width = 676
  Height = 426
  Caption = 'Editor de texto'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  OnCanResize = FormResize
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  object RichEdit: TRichEdit
    Left = 0
    Top = 0
    Width = 665
    Height = 353
    TabOrder = 0
    OnChange = RichChange
  end
  object StatusBar1: TStatusBar
    Left = 0
    Top = 353
    Width = 668
    Height = 19
    Panels = <
      item
        Width = 50
      end
      item
        Text = 'Escribe arriba lo que desees.'
        Width = 50
      end>
  end
  object SaveDialog1: TSaveDialog
    DefaultExt = 'txt'
    FileName = 'prueba'
    Filter = 'Archivos de texto|*.txt|Scripts|*.scp'
    Left = 32
    Top = 40
  end
  object MainMenu1: TMainMenu
    Left = 72
    Top = 40
    object N1: TMenuItem
      Caption = 'Archivo'
      Default = True
      object Guardar1: TMenuItem
        Caption = 'Guardar'
        OnClick = Guardar1Click
      end
    end
  end
end

Programa:

Código Delphi [-]
program edittxt;

uses
  Forms,
  editortextos in 'editortextos.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Unidad:

Código Delphi [-]
unit editortextos;

interface

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

type
  TForm1 = class(TForm)
    RichEdit: TRichEdit;
    StatusBar1: TStatusBar;
    SaveDialog1: TSaveDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Guardar1: TMenuItem;
    procedure FormResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Guardar1Click(Sender: TObject);
    procedure RichChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  cambiado: boolean;

implementation

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
RichEdit.Width:=form1.Width - 9 ;
RichEdit.Height:=form1.height - 73
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if cambiado = true then
form1.SaveDialog1.Execute;
end;

procedure TForm1.Guardar1Click(Sender: TObject);
begin
 //  if SaveDialog1.Execute then begin
 //   RichEdit1.SaveToFile(SaveDialog1.FileName);
 // end;
  Showmessage('Próximamente jaj');
end;

procedure TForm1.RichChange(Sender: TObject);
begin
cambiado:=true
end;

end.

maeyanes 27-02-2008 18:59:26

Creo que existe un error en el código de dec y es:

Código Delphi [-]
begin  
  if SaveDialog1.Execute then
    RichEdit1.Lines.SaveToFile(SaveDialog1.FileName)
end;

Ahora, te recomiendo mucho que no solo hagas copiar y pegar, trata de entender el código que se te proporciona antes de usarlo...


Saludos...

rauros 27-02-2008 19:15:58

Eso es lo que hago siempre ... El problema es que yo no tengo ni idea de que iba por en medio la parte line...

rauros 27-02-2008 19:18:54

{\rtf1\ansi\ansicpg1252\deff0\deflang3082{\fonttbl{\f0\fnil MS Sans Serif;}}
\viewkind4\uc1\pard\f0\fs16
\par }

Vale. Si lo pongo en blanco aparece eso. ¿Se puede hacer que no salga?

dec 27-02-2008 19:19:23

Hello,

Me disculpo por el error. :o

rauros 27-02-2008 20:08:53

Okey. Ahora necesito saber como cambiar entre forms. He probado con application.form2.visible:=true pero no funciona. ¿Alguna ayuda?

Nota: Ayudadme también con lo arriba expuesto.

jachguate 27-02-2008 20:58:13

Código Delphi [-]
Form2.Show;
Form2.BringToFront;

Hasta luego.

;)

ixMike 27-02-2008 22:02:19

Hola.

Veamos, si utilizas un RichEdit, el texto con que trabajarás será texto enriquecido, es decir, que le puedes poner negritas, cursivas, distintos tamaños, colores y resaltados... por eso cuando "lo ponías en blanco" te salían esos carácteres extraños, ¿por casualidad abriste el archivo con Bloc de notas? :rolleyes:

Te recomiendo que empieces por lo muy sencillo, texto plano, sin formato, con un TMemo.

El componente lleva automatizado prácticamente todo: escribir en él (con sus enters, Ctrl + C, Ctrl + V... Ctrl + Right... Av. Pág.... todo). Creo que le falta lo de cambiar Insert por Overwrite (insertar-sobreescribir), pero no es muy difícil de implementar. De todas formas, eso para después :)

El texto que se escribe en el TMemo se guarda en su propiedad Lines, de tipo TStrings. Con este tipo puedes abrir y guardas los archivos te texto. OpenDialog y SaveDialog sólo sirven para mostrar el diálogo de abrir/guardar, y darte el nombre del archivo seleccionado (propiedad FileName), nada más.

Seguro que quieres poner un menú. Utiliza TMainMenu. Nada más colocarlo te aparece (al igual que con TOpenDialog y TSaveDialog) un "cuadradito" en el form. Es porque es un componente no visual. Si le haces doble clic, aparecerá otra ventana, donde podrás diseñar el menú del programa. En cada item nuevo de menú, puedes asociar a su propiedad ShortCut, un atajo de teclado (Ctrl + A para abrir, por ejemplo). Sólo tienen un evento, OnClick, así que no tienen pérdida (ten cuidado, en los menús de la barra, el sólo darles el foco con ratón o teclado una vez el menú está activo, hace que el evento OnClick se ejecute).

Para cambiar la fuente, tienes TFontDialog. Muestra el típico diálogo de cambiar fuente, y la fuente elejida se guarda en su propiedad Font.


Esto es lo principal que necesitas saber. Después te podremos ayudar a añadir cosas para hacer tu programa más funcional, como que recuerde la fuente con que se usó, colocarle una barra de estado, una barra de herramientas... todo lo que se te pueda ocurrir.

Investiga todos estos componenetes que te he nombrado en la ayuda de Delphi. Pero a fondo, con diccionario de inglés en mano. Y si hay una propiedad o método que no entiendas, pues pásate por aquí para preguntar (pero recuerda hacer antes una búsqueda, tanto en los foros como en Google u otro buscador).


Salu2 ;)

rauros 27-02-2008 22:30:21

Okey. Lo único que no sabía era lo del richedit que ahora que lo pienso en castellano es texto enriquecido (uuu soy casi superdotado xD). Lo he cambiado por Tmemo, y menú yo ya tenía. Ahora voy a por un toolbar. Así que mi siguiente pregunta es donde puedo encontrar fotitos chorras de esas que salen como copiar, pegar, imprimir etc... Le he puesto un popup también al memo con algo muy simple. Y si editas el texto y te sales sin guardar te pregunta si quieres guardar o no. Otra pregunta que tengo es como parar el proceso de cerrado de una aplicación. Gracias de antemano.

rauros 27-02-2008 22:35:39

Bueno, como me voy a madrugar ya os pongo el código que tengo hasta ahora.

·Program:

Código Delphi [-]
program edittxt;

uses
  Forms,
  editortextos in 'editortextos.pas' {Form1},
  guardar in 'guardar.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

·Unidad prinicipal:

Código Delphi [-]
unit editortextos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Menus, ToolWin;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    SaveDialog1: TSaveDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Guardar1: TMenuItem;
    PopupMenu1: TPopupMenu;
    Copiar1: TMenuItem;
    Pegar1: TMenuItem;
    N2: TMenuItem;
    Exit1: TMenuItem;
    Salir1: TMenuItem;
    ToolBar1: TToolBar;
    Memo1: TMemo;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    procedure FormResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Guardar1Click(Sender: TObject);
    procedure Copiar1Click(Sender: TObject);
    procedure Pegar1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure Salir1Click(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
   private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  cambiado: boolean;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
//RichEdit.Width:=form1.Width - 9 ;
//RichEdit.Height:=form1.height - 73
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if cambiado = true then
Form2.Show;
Form2.BringToFront;
exit;
  //if SaveDialog1.Execute then begin
  //memo1.Lines.SaveToFile(SaveDialog1.FileName);
  //end;
end;

procedure TForm1.Guardar1Click(Sender: TObject);
begin
begin  
  if SaveDialog1.Execute then
  memo1.Lines.SaveToFile(SaveDialog1.FileName);
  cambiado:=false
  end;
end;

procedure TForm1.Copiar1Click(Sender: TObject);
begin
memo1.CopyToClipboard;
end;

procedure TForm1.Pegar1Click(Sender: TObject);
begin
memo1.PasteFromClipboard;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
Halt;
end;

procedure TForm1.Salir1Click(Sender: TObject);
begin
halt;
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
cambiado:=true
end;

end.

·Unidad de guardado de seguridad:

Código Delphi [-]
unit guardar;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
if SaveDialog1.Execute then begin
memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
halt;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
Form1.Show;
Form1.BringToFront;
end;

end.

·Unidad gráfica principal.

Código Delphi [-]
object Form1: TForm1
  Left = 349
  Top = 306
  Width = 676
  Height = 426
  Caption = 'Editor de texto'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  OnCanResize = FormResize
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  object StatusBar1: TStatusBar
    Left = 0
    Top = 394
    Width = 651
    Height = 19
    Panels = <
      item
        Width = 50
      end
      item
        Text = 'Escribe arriba lo que desees.'
        Width = 50
      end>
  end
  object ToolBar1: TToolBar
    Left = 0
    Top = 0
    Width = 651
    Height = 25
    ButtonWidth = 25
    Caption = 'ToolBar1'
    TabOrder = 1
    object ToolButton1: TToolButton
      Left = 0
      Top = 2
      Width = 8
      Caption = 'ToolButton1'
      Style = tbsSeparator
    end
    object ToolButton2: TToolButton
      Left = 8
      Top = 2
      Caption = 'ToolButton2'
    end
  end
  object Memo1: TMemo
    Left = 0
    Top = 25
    Width = 651
    Height = 353
    Align = alTop
    Lines.Strings = (
      '')
    PopupMenu = PopupMenu1
    TabOrder = 2
    OnChange = Memo1Change
  end
  object SaveDialog1: TSaveDialog
    DefaultExt = 'txt'
    FileName = 'prueba'
    Filter = 'Archivos de texto|*.txt|Scripts|*.scp'
    Left = 32
    Top = 40
  end
  object MainMenu1: TMainMenu
    Left = 64
    Top = 40
    object N1: TMenuItem
      Caption = 'Archivo'
      Default = True
      object Guardar1: TMenuItem
        Caption = 'Guardar'
        OnClick = Guardar1Click
      end
      object Salir1: TMenuItem
        Caption = 'Salir'
        OnClick = Salir1Click
      end
    end
  end
  object PopupMenu1: TPopupMenu
    Left = 96
    Top = 40
    object Copiar1: TMenuItem
      Caption = 'Copiar'
      OnClick = Copiar1Click
    end
    object Pegar1: TMenuItem
      Caption = 'Pegar'
      OnClick = Pegar1Click
    end
    object N2: TMenuItem
      Caption = '________'
    end
    object Exit1: TMenuItem
      Caption = 'Salir'
      OnClick = Exit1Click
    end
  end
end

·Unidad gráfica de guardado de seguridad:

Código Delphi [-]
object Form2: TForm2
  Left = 534
  Top = 286
  Width = 245
  Height = 139
  Caption = '¡Atencion!'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 56
    Top = 16
    Width = 124
    Height = 13
    Caption = '¿Deseas guardar el texto?'
  end
  object Button1: TButton
    Left = 40
    Top = 40
    Width = 75
    Height = 25
    Caption = 'Si'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 120
    Top = 40
    Width = 75
    Height = 25
    Caption = 'No'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 80
    Top = 72
    Width = 75
    Height = 25
    Caption = 'Cancelar'
    TabOrder = 2
    OnClick = Button3Click
  end
end

ixMike 27-02-2008 22:39:57

El Memo ya tiene su propio menú de sistema. Sólo es conveniente cambiarlo si puedes añadir más cosas.

¿Fotitos chorras? En el CD Delphi Pack 1 venían un montón... pero ya no sé qué fue de eso :(

¿Parar el proceso de cerrado? ¿Te refieres a que al darle a la "x" de cerrar, o pulsar Alt + F4, o llamar al método Close; no se cierre el programa? En en evento OnCloseQuery del Form principal, pon CanClose:=False; pero ten en cuenta que debes poner alguna condición, sino sólo podrás salir con Application.Terminate; o con Halt;


Salu2 :)

rauros 27-02-2008 23:02:21

Okey pero el canclose va con application? Con form? Sola? he probado con todas pero me dan errores.

Código Delphi [-]
if cambiado = true then
canclose:=false;

jachguate 27-02-2008 23:14:33

Eso va en el evento OnCloseQuery y podrías abreviarlo en:

Código Delphi [-]
begin
  CanClose := not Cambiado;

Hasta luego.

;)

ixMike 28-02-2008 02:15:26

Cita:

Empezado por rauros (Mensaje 269172)
Okey pero el canclose va con application? Con form? Sola? he probado con todas pero me dan errores.

Creo que lo he dejado claro :cool:

Cita:

Empezado por ixMike (Mensaje 269157)
En en evento OnCloseQuery del Form principal, pon CanClose:=False;


rauros 28-02-2008 14:44:44

Okey, ahora quiero saber como coger el valor de Tform1.memo1.lines desde tform2. Gracias por la ayuda.

Por si no ha quedado claro. Quiero coger lo escrito en un memo (memo1) de un form (Tform1) y usarlo en otro form (Tform2).

ixMike 28-02-2008 17:38:36

El form está en una unit. Tan sólo tienes que añadir esa unit a la uses del otro form.

Aunque ni si quiera eso es necesario, sencillamente, desde cualquier parte de form2 escribe:

Código Delphi [-]
Form1.Memo1.Lines...


Al darle a compilar, te saldrá un mensaje de Delphi preguntando si quieres añadir la unit. Tú sólo di que sí.


Salu2.

rauros 28-02-2008 18:02:15

Oye ahora es una duda sobre sintaxis sobre lo que dijo jachguate.
En matemáticas cuando niegas algo se convierte al contrario. Quiero saber que si not true = false. Por lo de canclose.
CanClose := not Cambiado;

Y otra cosa. Si canclose:=true; se para automáticamente el programa?
O termina procedure y entonces si canclose:=true lo cierra?

Delphius 28-02-2008 18:17:57

Hola rauros, creería que la ayuda que acompaña a Delphi lo explica bien.
Cita:

Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close. The handler specified by OnClose might, for example, test to make sure all fields in a data-entry form have valid contents before allowing the form to close.

A form is closed by the Close method or when the user chooses Close from the form's system menu.

The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines if the form actually closes. These are the possible values of Action:

Value Meaning

caNone The form is not allowed to close, so nothing happens.
caHide The form is not closed, but just hidden. Your application can still access a hidden form.
caFree The form is closed and all allocated memory for the form is freed.
caMinimize The form is minimized, rather than closed.

To close the form and free it in an OnClose event, set Action to caFree.

Note: When the application shuts down, the main form receives an OnClose event, but any child forms do not receive the OnClose event.
Si tienes una única form, ¿que crees que sucede cuando se cierra?

Por el tema del NOT es como dices, el negado:

Código:

Valor |NOT valor
----------------
true  |False
False |True

Además, si realizas una búsqueda sobre CanClose en los foros podrás llegar a comprender mejor su uso.

Saludos,

rauros 28-02-2008 21:07:24

Okey. Lo entiendo al dedillo. Ahora para complementarlo necesitaría saber que valor alberga la posición del puntero del memo en cada momento. Por ejemplo:

Saludillos hijos de cristo

La posición sería 1:9

abc
def
ghi

La posición sería 3:3

Saludillos y gracias por toda la ayuda.

ixMike 28-02-2008 21:16:34

No se llama puntero, se llama cursor ;), y puedes saberlo mediante las propiedades Row, Line, Col... o algo así (es que en mi versión esas propiedades no existen :().

Salu2 :)


P.D.: Te recomiendo que, cuando no sepas algo, recorras todas las propiedades, eventos y métodos de un tipo de objeto, y te guíes por tu conocimiento de inglés para adivinar para qué sirven. Así yo he aprendido muchísimo.

rauros 29-02-2008 14:26:56

Vale. En memo1 no he podido encontrar ni memo1.row ni memo1.col . He encontrado lo más parecido memo1.lines lo más parecido.

rauros 29-02-2008 14:47:24

El sistema de richedit (la demo de delphi) es este:

Código Delphi [-]
procedure TMainForm.UpdateCursorPos;
var
  CharPos: TPoint;
begin
  CharPos.Y := SendMessage(Editor.Handle, EM_EXLINEFROMCHAR, 0,
    Editor.SelStart);
  CharPos.X := (Editor.SelStart -
    SendMessage(Editor.Handle, EM_LINEINDEX, CharPos.Y, 0));
  Inc(CharPos.Y);
  Inc(CharPos.X);
  StatusBar.Panels[0].Text := Format(sColRowInfo, [CharPos.Y, CharPos.X]);
end;

En private está declarada. El problema es este:

Código Delphi [-]
procedure TMainForm.SelectionChange(Sender: TObject);
begin
  with Editor.Paragraph do
  try
    FUpdating := True;
    FirstInd.Left := Trunc(FirstIndent*RulerAdj)-4+GutterWid;
    LeftInd.Left := Trunc((LeftIndent+FirstIndent)*RulerAdj)-4+GutterWid;
    RightInd.Left := Ruler.ClientWidth-6-Trunc((RightIndent+GutterWid)*RulerAdj);
    BoldButton.Down := fsBold in Editor.SelAttributes.Style;
    ItalicButton.Down := fsItalic in Editor.SelAttributes.Style;
    UnderlineButton.Down := fsUnderline in Editor.SelAttributes.Style;
    BulletsButton.Down := Boolean(Numbering);
    FontSize.Text := IntToStr(Editor.SelAttributes.Size);
    FontName.Text := Editor.SelAttributes.Name;
    case Ord(Alignment) of
      0: LeftAlign.Down := True;
      1: RightAlign.Down := True;
      2: CenterAlign.Down := True;
    end;
    UpdateCursorPos;
  finally
    FUpdating := False;
  end;
end;

Que en richedit hay selectionchange y en memo no hay... ¿Hay alguna manera de adaptarlo para memo? Lo que quiero es:

Que aparezca abajo en el "statusbar" la información de donde está el puntero. Gracias de antemano

ixMike 29-02-2008 15:17:47

Creo que ya te dije para qué es la propiedad Lines del TMemo. ¿Has probado con Position, Coordinates, XY.... algo así? Busca, busca, busca, busca.... ahí está la clave.

Acabo de hacer una búsqueda: http://www.clubdelphi.com/foros/showthread.php?t=34479

Ale, CaretPos.


Salu2 :)

rauros 29-02-2008 15:48:08

Vale. Ahora necesito que me recomendéis un buen evento para que se actualice cada vez que clique, he probado con OnKeyPress porque creía que hacía referencia a cada botón pulsado del teclado pero se ve que no es eso. Gracias muchas a todos que me ayudáis día y noche.

rauros 29-02-2008 17:18:59

Y otra pregunta (estoy pesadito ee jej). He intentado modificar caretpos.x para hacer una especie de "ir a linea" pero me da error de "left side cannot be assigned to". ¿Ese error es porque no se puede modificar? En ese caso, ¿Cómo puedo arreglarlo? Gracias muchas de antemano.

Nota: es caretpos.y pero no funciona igual...

maeyanes 29-02-2008 17:59:51

Hola...

Ese error se de mayormente cuando la propiedad que deseas modificar es de tipo Record o asignar un valor a una constante...

Tienes que buscar otro mecanismo para hacer lo que quieres, tal vez mediante un mensaje enviado al control TMemo...



Saludos...

ixMike 29-02-2008 19:53:02

Para la próxima vez, ten en cuenta que "cada vez que clique" significa click del ratón, y tú lo que pides es "cada vez que pulse una tecla", o más simple, "teclee".

El evento OnKeyPress sólo captura teclas que escriben, y unas pocas más (Escape, Enter, Backspace, Tab...). Para todas las demás, tendrás que usar OnKeyDown u OnKeyUp (según pulses o sueltes).

Los valores de Key están listados en Virtual Key Codes (ayuda de Delphi). Todos empiezan por "VK_".


Salu2.


La franja horaria es GMT +2. Ahora son las 21:43:50.

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