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 29-02-2008 21:46:47

Tengo otra duda. Si dejas pulsado el botón se activa el evento cada x tiempo? No estoy en mi casa y no puedo comprobarlo.

ixMike 29-02-2008 21:59:10

Sí, pero de esta forma:

-Pulsas (sin soltar).
-Instantáneamente aparece lo pulsado.
-Pasa como un segundo.
-Hasta que no sueltes, cada pocas centésimas de segundo se repite la pulsación.


Salu2.

P.D.: También te podrías haber esperado a llegar a casa, ¿no? :D

rauros 03-03-2008 18:31:28

Lo siento, tenía mucha curiosidad. La próxima vez me la trago. He adelantado mucho muchísimo en el proyecto. Ahora necesito saber como puedo imprimir memo1 si el dialogo de impresión es PrintDialog1 (el nombre me da igual que pongáis...). He buscado sobre el tema pero el sistema que se usa para imprimir el texto enriquecido no tiene nada que ver... Muchas gracias de nuevo.

rauros 04-03-2008 14:17:30

Saludillos. Ayer estuve hablando con IxMike sobre el tema, pero me dió un error muy raro simplemente al escribir esto:

Código Delphi [-]
Memo1.Lines.AddStrings(Printer.Printers);

La impresora está detectada y funciona correctamente. Una descripción del error:

·Me obliga a resetear la apliación (ctrl + f2)
·Datos del mensaje:
EAccesViolation. Acces violation at address 00429EAC (Resumido con los datos más importantes)

·Cuando abro la ventanilla del idioma en ensamblador aprace esto:

cmp dword ptr [eax+$10],$00

Si con esto podéis ayudarme os lo agradecería mucho. Si no podéis os subo una foto de el error o lo que vosotros me digáis que necesitéis. Que no os quiero molestar mucho. Gracias de antemano.

rauros 04-03-2008 17:14:05

Aparte necesito una pequeñita ayuda. Es que cuando se cierra la aplicación te pregunte si quieres guardar. Entonces yo he hecho esto, pero si clico en cualquier botón me lo vuelve a preguntar(dos veces, luego hace lo que tiene que hacer).

Código Delphi [-]
If cambiado = true then begin
form3:=Tform3.Create(Self);
if form3.ShowModal=mrOk then begin//si se ha puslado aceptar...
form3.Free;
if form1.SaveDialog1.Execute then begin//Se carga guardar...
Form1.memo1.Lines.SaveToFile(form1.SaveDialog1.FileName);
halt;
end;
end
else if form3.ShowModal=mrCancel then begin//si se ha puslado cancelar...
canclose:=false;
form3.Destroy;
end;
end;
end;

Delphius 04-03-2008 17:52:39

Cita:

Empezado por rauros (Mensaje 270537)
Aparte necesito una pequeñita ayuda. Es que cuando se cierra la aplicación te pregunte si quieres guardar. Entonces yo he hecho esto, pero si clico en cualquier botón me lo vuelve a preguntar(dos veces, luego hace lo que tiene que hacer).

Código Delphi [-]If cambiado = true then begin form3:=Tform3.Create(Self); if form3.ShowModal=mrOk then begin//si se ha puslado aceptar...
form3.Free;
if form1.SaveDialog1.Execute then begin//Se carga guardar...
Form1.memo1.Lines.SaveToFile(form1.SaveDialog1.FileName);
halt;
end;
end else if form3.ShowModal=mrCancel then begin//si se ha puslado cancelar...
canclose:=false;
form3.Destroy;
end;
end;
end;

El problema de porque te lo muestra dos veces se debe a que ShowModal abre la ventana y se queda esperando la orden de pulsado y una vez que se recibe esa orden (que se traduce en esas constantes mrok, etc) se debe decidir que hacer se soluciona de esta simple manera:

Código Delphi [-]
if form3.ShowModal = mrOK
  then begin
         // se ha dado OK... que hacer
         end
  else begin
          // se ha dado en Cancel... que hacer...
        end;

E incluso podrías hacerlo mejor con un case:

Código Delphi [-]
case form3.ShowModal of
mrOK: //que hacer....
...
end;

Por lo de el error de Access Violation y el código ese... tendría que fijarme... no tengo delphi abierto en estos momentos.

Saludos,

rauros 04-03-2008 19:33:22

El problema es que no se usar el case con más de una linea seguida... ¿Cómo puedo hacer 2 sumas, por ejemplo?

Case x of
1: y:=5+3;
y:= y * 2;
2: ...

etc... Cargar dos lineas en el mismo case.

Delphius 04-03-2008 19:45:28

Hola, creo haberte explicado en otra ocasión que la regla dice así:

Cita:

si en algún momento determinado se necesita de más de una sentencia, necesariamente deben ir entre begin y end.
Código Delphi [-]
case algo of
1: begin
     //sentencias
    end;
2: begin
    //sentencias
    end;
3: una sola sentencia
end; // fin case

Saludos,

jachguate 04-03-2008 20:48:29

Generalizando la regla... en pascal, cualquier lugar donde iría una sentencia, podes sustituirlo por un grupo de sentencias encerradas en un bloque begin/end.

Hasta luego.

;)

rauros 04-03-2008 21:47:50

Okey. Ahora he conseguido hacer que funcione. Y todo gracias a vosotros. Y gracias por esa regla de sintaxis, es bastante útil.

rauros 04-03-2008 22:30:27

Otro error. Y este si que es grave. La compilación del archivo solo me funciona a mí. A los demás usuarios no les funciona. Mando el proyecto + código source a esta dirección: http://rs2.rapidshare.com/files/9707...tor_textos.zip

Gracias varias de antemano.

ixMike 04-03-2008 22:42:17

Varios detalles....

- En el bucle de "chorraditas" añade la línea Application.ProcessMessages, así por lo menos podremos deter el efecto cerrando la aplicación ;) (y ni se te ocurra preguntar qué es ProcessMessages, ¡lo buscas! :p)

- En "Contactar", podrías mostrar ambos mensajes en la misma ventana. Tan sólo tienes que separar ambas líneas con el carácter #13 (Enter):

Código Delphi [-]
MessageBox(Handle, 'Linea 1'+#13+'Linea 2'+#13#13#13+'Línea muy separada', 'Título', MB_OK+MB_ICONINFORMATION);

- El MessageBox (o Application.MessageBox) también te sirve para hacer el "guardado de seguridad". Es más cómodo (y gasta menos tiempo a la hora de diseñar y menos espacio en el ejecutable). Algo así:

Código Delphi [-]
Case Application.MessageBox(PChar('¿Desea guardar cambios al archivo "'+NombreArchivo+'"?'), 'Guardado de seguridad', MB_ICONQUESTION + MB_YESNOCANCEL) of
  ID_YES: Guaradar;
  ID_NO: Salir;
  //ID_CANCEL: No ponemos nada, puesto que "Cancelar" ahí es no hacer nada
 end;

Busca en el archivo de ayuda Win32.hlp todas las posibles opciones (flags) para MessageBox. Por ejemplo, otra que podrías poner en lugar de MB_ICONQUESTION sería MB_ICONWARNING.

- Interesante dato del portafolios ;) (aunque, ¿no es portapapeles? :D).

- "Altura" y "anchura" son palabras incorrectas, Lo ideal sería hacer como Delphi, o Word:
Cita:

Lin 10 : Col 5
Línea y columna (posición "y" y posición "x").

Además, con que lo pongas en un sólo panel sobra (de hecho, se hace más legible ;))

Y lo más importante, ¡he podido ejecutarlo! No sé qué fallo tendrán las otras máquinas... :confused:

rauros 05-03-2008 19:58:28

Muchas gracias por toda toda y toda la ayuda, me ha servido siempre. Cambiando de tema, empecemos ya con el código coloreado, creo que todo lo demás ya lo tengo muy visto (he añadido un sistema con claves de registro para que el programa se abra en el mismo sitio que en el que se cierra). He cogido los ejemplos pero veo que son muy complejos y que faltan algunos .dcu . Y lo que quiero es saber como se colorea, lo más simple posible. Puesto que voy a coger uno de los dos ejemplos y me voy a liar antes de encontrar la solución.
Preguntas:

·¿Qué objeto debo usar?
·¿Con este objeto puedo guardar en texto simple (.txt)?

rauros 06-03-2008 14:07:14

Vale. Se que necesito UniSynEdit o algo parecido (gracias IxMike). ¿Cómo puedo instalar el package del SynEdit? He estado buscando sobre el tema pero he encontrado poco y lo poco que he encontrado era inservible. Gracias de antemano a tod@s.

ixMike 06-03-2008 17:02:33

Puntualiza, rauros.

Se descargó en paquete, pero no hay forma de instalarlo. Bueno, yo es que hace tiempo que no instalo ninguno, y debido a las diferencias entre mi versión y la suya, pues no he podido ayudarle :(

Tiene que ver con lo que en Delphi 3 se llama "Library Path" (está el Options del Package).

Salu2.

rauros 07-03-2008 17:01:04

Okey, el problema anterior ya lo posteé en varios (aún no me ayudó nadie :S). Ahora tengo otro problema. Quiero hacer un "autocompletar". El algoritmo lo tengo ya hecho, solo me falta un procedimiento. Mi código:

Código Delphi [-]
texto:=Uppercase(memo1.lines.strings[memo1.caretpos.y]);
if Texto ='IF' then begin
memo1.Lines.Strings[memo1.CaretPos.y]:='If';
memo1.Lines.Add('');
memo1.Lines.Add('');
memo1.Lines.Strings[memo1.CaretPos.y]:='EndIf';
end;

Pues con eso si hay algo escrito en medio lo salta. Un ejemplo:

Código:

I          //escribiendo "if"
destroy //algo escrito

Después

Código:

If
destroy

EndIf

Exactamente se quedaría así. ¿Cómo podría arreglarlo para que se quede así:?

Código:

If

EndIf
destroy

Muchas gracias a todos que me ayudáis siempre.

rauros 09-03-2008 12:49:09

Vale. Lo anterior ya está solucionado. Ahora tengo 2 problemas:

·No puedo instalar UniSynEdit (posteé en varios pero nadie me ayudó :S)
·Auto completar no funciona como querría que funcionara. Lo que quiero hacer es:

Que si escribo una palabra, se sustituya por otra, o la otra se escriba unos huecos más abajo.

Mi procedimiento de auto completar:

Código Delphi [-]
Procedure autocompletar(Memo: TMemo; leer: string; separacion: integer; sustituir: string);
begin
if form1.CheckBox1.Checked then begin // Este if funciona.
With Memo do begin
  posac:=caretpos.y;
  if uppercase(lines.strings[caretpos.y]) = uppercase(leer) then begin
    if separacion <> 0 then begin
      for n:=1 to separacion do Sustituir:=#13#10+Sustituir;
    SelText:=sustituir;
    end
    else begin
    lines.strings[caretpos.y]:=sustituir
    end;
  end;
end;
end;
setmemoposition(memo, memo.selstart,0)
end;

Para llamar a auto completar:
Código Delphi [-]
AutoCompletar(memo1,'If ',2,'EndIf'); // Escribe 2 lineas debajo EndIf cuando escribo If 
AutoCompletar(memo1,'[it',0,'[ItemDef  ]');//Sustituye [it por [ItemDef  ]

El problema es que cuando escribo If se me baja a endif en vez de volver a su sitio anterior. Y cuando vuelvo manualmente se vuelve loco el auto completar. El procedimiento de SetMemoPosition:

Código Delphi [-]
Procedure SetMemoPosition(Memo: TMemo; Col, Line: Integer);
var
i, Cuenta: Integer;
begin
with Memo do begin
LockWindowUpdate(Handle);
Cuenta:=0;
if Line<=Lines.Count then
  begin
  i:=0;
  While ido
    begin
    Inc(Cuenta,2+Length(Lines[i]));
    Inc( i);
    Perform(EM_SCROLL,SB_LINEDOWN,0);
    end;
  If Col<=Length(Lines[i]) then
    begin
    Inc(Cuenta,Col);
    SelStart:=Cuenta;
    end;
  end;
LockWindowUpdate( 0);
Refresh;
end; //with Memo do
end;

También tengo problemas con un procedimiento que se supone que tiene que escribir al final de todo lo escrito [EOF]. El procedimiento:

Código Delphi [-]
procedure EndOfFileAutomatico(memo: TMemo; right: boolean);
var
  posicionAnt: integer;
begin
if right then begin
if UpperCase(memo.Lines.Strings[memo.Lines.count + 1]) <> '[EOF]' then begin
    posicionant:=memo.CaretPos.y;
    memo.lines.strings[memo.lines.count]:='[EOF]';
    setmemoposition(memo, memo.selstart, posicionant)
end;
end;
end;

Para llamar al procedimiento:

Código Delphi [-]
EndOfFileAutomatico(memo1,checkbox1.Checked);

Muchísimas gracias de antemano.

basti 09-03-2008 13:57:27

Cita:

Empezado por dec (Mensaje 268847)
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


Lo que tu digas Dec (que para eso es tu creación); pero yo lo uso como sustituto (o mejora) del block de notas, y estoy muy contento con él, ligero, rápido...


La franja horaria es GMT +2. Ahora son las 01:51:39.

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