Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Texto del portapapeles sin Clipbrd.dcu (https://www.clubdelphi.com/foros/showthread.php?t=34151)

ixMike 28-07-2006 19:49:55

Texto del portapapeles sin Clipbrd.dcu
 
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:
Código Delphi [-]
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 ;)

Código Delphi [-]
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

Cita:

Empezado por dec
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

Cita:

Empezado por roman
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).


La franja horaria es GMT +2. Ahora son las 07:46:12.

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