PDA

Ver la Versión Completa : Ayuda con error "Variable required"


JuanOrtega
12-07-2013, 18:20:20
Tengo el siguiente codigo :


unit test;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var test: TFileStream;

begin

test:= TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'programa.exe', fmOpenWrite );
test.Position := test.Size;

test.Write('{test}'+Edit1.Text+'{test}',1024);

test.Free;

end;


Pero cuando lo cargo me dice [DCC Error] test.pas(36): E2036 Variable required

¿ Alguien me podria explicar como lo soluciono ?

ecfisa
12-07-2013, 18:35:37
Hola Lepuke.


...
var
test: TFileStream;
str: string;
begin
test:= TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'programa.exe', fmOpenWrite );
try
test.Position := test.Size;
str := '{test}' + Edit1.Text + '{test}';
test.Write(str, 1024);
finally
test.Free;
end;
end;


Saludos :)

ecfisa
12-07-2013, 19:00:15
Hola de nuevo.

La sugerencia del mensaje anterior soluciona el mensaje de error. Pero me quedé pensando que si tu intención es guardar la cadena textual al fin del archivo, ese código no te va a funcionar.

Hacelo de este modo:

var
str : string;
i : Integer;
begin
str := ExtractFilePath( Application.ExeName ) + 'programa.exe';
with TFileStream.Create(str, fmOpenReadWrite) do
try
str := '{test}' + Edit1.Text + '{test}';
Seek(0, soFromEnd);
for i:= 1 to Length(str) do
Write(str[i], 1);
finally
Free;
end;
end;


O también podrías hacer:

var
str : string;
vec : array[0..1024] of char;
begin
str := ExtractFilePath( Application.ExeName ) + 'programa.exe';
with TFileStream.Create(str, fmOpenReadWrite) do
try
str := '{test}' + Edit1.Text + '{test}';
Seek(0, soFromEnd);
StrPCopy(vec, str);
WriteBuffer(vec, Length(str));
finally
Free;
end;
end;


Saludos. :)

JuanOrtega
12-07-2013, 22:52:40
Antes que nada , gracias por la ayuda , pero me han surgido dos grandes problemas , el primero es que cada vez que uso un edit en la variable no figura nada en el editor winhex , te lo digo porque cada vez que compilo abro el ejecutable con winhex y controlo , eso si , cuando uso texto solo sin nigun edit se muestra mas que bien en winhex , el otro problema es que no entiendo porque el codigo en el que me ayudaste la otra vez tiene problemas para mostrarme bien las impresiones que me ayudaste hacer en este post , hay veces que se muestran (rara vez) pero en las demas veces no eh tenido suerte.

Te dejo la imagen que saque del winhex porque el siguiente codigo no me lo muestra completo.

http://img836.imageshack.us/img836/3206/la49.jpg


var
Buffer: array [0 .. 1023] of Char;
str: string;
begin
Memo1.Clear;
str := ExtractFilePath(Application.ExeName) + 'test.exe';
with TFileStream.Create(str, fmOpenRead) do
try
Memo1.Lines.BeginUpdate;
SetLength(str, 1024);
while Position < Size do
begin
Read(Buffer, 1024);
StrCopy(PChar(str), Buffer);
Memo1.Lines.Add(str);
end;
finally
Memo1.Lines.EndUpdate;
Free;
end;
end;

ecfisa
12-07-2013, 23:28:48
Hola Lepuke.
el primero es que cada vez que uso un edit en la variable no figura nada en el editor winhex , te lo digo porque cada vez que compilo abro el ejecutable con winhex y controlo , eso si , cuando uso texto solo sin nigun edit se muestra mas que bien en winhex

La respuesta es simple: Una constante literal será visible con un editor hexadecimal sin problemas. Pero cláramente ningún editor mostrará el valor de una "variable", ya que por su esencia, no hay manera de que pueda conocer su valor.
Recorda que una variable toma un valor luego de que uno le sea asignado durante la ejecución de la aplicación.

el otro problema es que no entiendo porque el codigo en el que me ayudaste la otra vez tiene problemas para mostrarme bien las impresiones que me ayudaste hacer en este post , hay veces que se muestran (rara vez) pero en las demas veces no eh tenido suerte.

No entiendo a que te referis con impresiones y tampoco me queda claro que es lo que no se muestra bién.

Saludos. :)

JuanOrtega
12-07-2013, 23:39:28
con impresiones me refiero a que yo estoy intentando agregar un valor a una aplicacion exe que es lo que estoy haciendo en este post , para despues con la otra aplicacion exe mostrar el valor que le deje marcado al exe (para sacar eso se abre a si mismo) , los dos programas son en delphi , por eso necesito mostrar todo el contenido de la segunda aplicacion que marque con la primera.
se me esta complicando mucho porque no entiendo un pepino de delphi por eso te muestro la imagen del winhex que es lo que estoy intentando sacar del exe lo que esta entre {test}

ecfisa
13-07-2013, 00:42:10
Hola Lepuke.
con impresiones me refiero a que yo estoy intentando agregar un valor a una aplicacion exe que es lo que estoy haciendo en este post , para despues con la otra aplicacion exe mostrar el valor que le deje marcado al exe (para sacar eso se abre a si mismo)


Revisa en este enlace: Dejar una marca en los archivos (http://www.clubdelphi.com/foros/showthread.php?t=83502)

Pero como un humilde consejo y sin ningún ánimo de ofender, si como vos comentas "no entendes un pepino de delphi", lo que estas encarando es un poco elevado para incorporarlo dentro de los primeros proyectos.

Saludos. :)

JuanOrtega
13-07-2013, 00:56:07
ok , gracias por el consejo , que desgracia estoy tan cerca solo me falta entender porque no me muestra todo el codigo binario.

ecfisa
13-07-2013, 03:09:12
Hola Lepuke.

Lo que podrías hacer es detallar bién que salida esperas, cuál te muestra (cuando lo hace mál) y el código involucrado (el que empleas para mostrarlo).
De ese modo seguramente podremos darte una ayuda más especifica y provechosa.

Saludos :)

Casimiro Notevi
13-07-2013, 09:28:26
Yo no entiendo ni un pepino de mecánica, pero he desarmado el motor de mi coche y ahora tengo unos pistones que me han dicho que si los recorto de una forma especial conseguiré que sea más potente que el Ferrari de Alonso, ¿alguien me puede ayudar?
;)

JuanOrtega
13-07-2013, 16:34:59
solucione la parte mas dificil que era leer el codigo completo , ahora me falta la primera que te mencione que no entiendo porque no funciona , creo que no me explique bien en mi primer punto asi que redacto de nuevo el problema

Tengo el siguiente codigo :


testar:= TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'test.exe', fmOpenWrite );
testar.Position := testar.Size;

aca:= '{test}test{test}';

testar.Write(aca,1024);

Este imprime bien la edicion en el codigo binario porque cuando lo veo con WinHex se ve bien , pero este otro codigo :


testar:= TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'test.exe', fmOpenWrite );
testar.Position := testar.Size;

aca:= '{test}' + Edit1.Text + '{test}';

testar.Write(aca,1024);

No muestra nada de nada porque parece que hay un problema con el edit cuando se quiere editar el codigo binario , es raro porque cuando
lo uso todo con comillas simples anda pero con el ejemplo del edit no funciona , ya casi termino solo me falta este detalle que no se porque es.

Nota : el programa no da ningun mensaje de error

ecfisa
13-07-2013, 23:46:47
...ahora me falta la primera que te mencione que no entiendo porque no funciona , creo que no me explique bien en mi primer punto asi que redacto de nuevo el problema

Tengo el siguiente codigo :

aca:= '{test}test{test}';

Este imprime bien la edicion en el codigo binario porque cuando lo veo con WinHex se ve bien , pero este otro codigo :


aca:= '{test}' + Edit1.Text + '{test}';

No muestra nada de nada porque parece que hay un problema con el edit cuando se quiere editar el codigo binario , es raro porque cuando lo uso todo con comillas simples anda pero con el ejemplo del edit no funciona , ya casi termino solo me falta este detalle que no se porque es.
...
Hola lepuke.

La explicación a ese comportamiento te la dí en el mensaje (#5) (http://www.clubdelphi.com/foros/showpost.php?p=463833&postcount=5), no podés ver el contenido de una variable o propiedad cuando aún no se le ha asignado un valor.

El compilador/linkeador traducirán el identificador (nombre de variable) a la dirección de memoria donde residirá el valor que se asigne a ella en tiempo de ejecución.

Resumiendo, no esperes ver algo como:

{test}Edit1.Text{test}

o:

{test}Edit1{test}

Por que eso no sucederá.

Saludos. :)

JuanOrtega
14-07-2013, 03:20:18
en cualquier momento me vuelvo loco y rompo la pc contra la pared xDD.

ya arregle el problema que te pregunte por segunda vez para cualquiera que tenga el mismo problema les dejo la solucion.

test.Write(PChar(tu_cadena)^,1024);

dandole vueltas al asunto recorde que me dijiste como poner texto al final del archivo binario , no quiero molestarte o pedir mucho porque necesito probar como seria la cosa pero totalmente al principio.

me podrias dar un ejemplo de como quedaria tu codigo al principio del programa ?