PDA

Ver la Versión Completa : Texto del portapapeles sin Clipbrd.dcu


ixMike
28-07-2006, 19:49:55
Hola, gente del foro

Quería saber cómo obtener el texto del portapapeles usando la API de windows, y no la uses Clipbrd.

Hice un proyecto de prueba, pero no me funciona (solo consigue los carácteres #10#13)

Este es el código:

program ClipBoardTextFileCreator;

uses Windows;

var
Puntero: PChar;
HC: THandle;
F: TextFile;

begin
OpenClipboard(GetModuleHandle(nil));
HC:=GetClipboardData(CF_TEXT);
Puntero:=GlobalLock(HC);
AssignFile(F, ParamStr(0)+'.txt');
ReWrite(F);
WriteLn(F, string(Puntero));
CloseFile(F);
GlobalUnlock(HC);
CloseClipboard;
end.


¿Alguien puede decirme dónde está el fallo?

Gracias.

seoane
28-07-2006, 21:41:57
El problema es una cosa sencillita, pero ya puestos, he retocado un poco el código espero que no te moleste ;)


var
hText: THandle;
pText: PChar;
F: TextFile;
begin
if IsClipboardFormatAvailable(CF_TEXT) then
if OpenClipboard(0) then
try
hText:= GetClipboardData(CF_TEXT);
if hText <> 0 then
begin
pText:= GlobalLock(hText);
if pText <> nil then
begin
AssignFile(F, ParamStr(0)+'.txt');
{$I-}
Rewrite(F);
{$I+}
if IOResult=0 then
begin
// Aqui estaba el error, para que lo convierta en string primero hay que indicarle que es un PChar
WriteLn(F, String(PChar(pText)));
CloseFile(F);
end;
GlobalUnlock(hText);
end;
end;
finally
CloseClipboard;
end;
end;

dec
29-07-2006, 03:01:44
Hola,

Joroba Seoane, eres como un libro abierto, no dejas de sorprender con el código fuente que escribes como un poeta... de los buenos. :eek: :)

seoane
29-07-2006, 03:14:13
Hola,
Joroba Seoane, eres como un libro abierto, no dejas de sorprender con el código fuente que escribes como un poeta... de los buenos


:o Me vas a hacer sonrojar. Citando a los clásicos "Hasta el mas tonto hace relojes" ;)

dec
29-07-2006, 04:20:24
Hola,

"Hasta el más tonto hace relojes", ¡Ay!, ya lo creo yo que sí. Pero, no es tu caso Seoane, no es tu caso. Y no digo que no pudieras dedicarte a relojero. :)

roman
29-07-2006, 04:34:50
Oigan, todo esto está muy bonito, de veras que sí, y coincido con David en que seoane es sorprendente; tal pareciera que cualquier cosa que se pregunte, él tiene justo enfrente un pedazo de código apropiado. Pero hay algo que me da curiosidad, sólo eso, ¿por qué no usar la unidad clipbrd?

// Saludos

seoane
29-07-2006, 12:19:25
Pero hay algo que me da curiosidad, sólo eso, ¿por qué no usar la unidad clipbrd?


Supongo, y es solo una suposición, que lo quiere así por el tamaño. Por el código que puso al principio deduzco que esta creando su aplicación directamente en el dpr sin usar demasiadas units. Un programa así te puede ocupar unos 16Kb, pues bien si se añade la unit clipbrd se están añadiendo a su vez classes y graphics, lo que engorda el ejecutable a unos 300 kb. Yo también pase por esa fiebre de intentar reducir los ejecutables usando solo las APIs, pero al final te das cuenta que estas reinventando la rueda y que es mucho trabajo. De todas formas es bueno conocer como funcionan las cosas por dentro y no quedarse en la superficie.

ixMike
09-08-2006, 19:40:05
Muschísimas gracias.

Y muy bonito el código.

El cuanto a por qué no usar la Clipbrd.dcu, pues que no me apetece multiplicar el tamaño de mi ejecutable casi por dos por algo tan pequeño que necesito (es que Clipbrd.dcu, Forms.dcu, Dialogs.dcu y Graphics.dcu son unidades que siempre intento evitar, soy un poco maniático con el espacio, sobre todo porque hasta hace poco tenía un HD de 15 GB nada más, y sin grabadora de CD ni pendrive, lo que me limitaba al uso de Floppys).