Avatar billede cppgames Nybegynder
26. juni 2001 - 13:56 Der er 9 kommentarer

vis kopieret tekst

hvordan gør jeg, hvis jeg vil have at når f.eks. dette markerere det her stykke tekst og trykker ctrl + c, så skal det der blev kopieret indsættes i mit TEdit felt, hvordan gør jeg det?

Jeg bruger Borland C++ Builder 5 Enterprise
Avatar billede disky Nybegynder
26. juni 2001 - 13:57 #1
skal det ske automatisk ?

Så skal du se om der bliver lagt noget på clipboardet, hvis der går indsæt det i feltet.
Avatar billede cppgames Nybegynder
26. juni 2001 - 13:59 #2
det skal ske automatisk

kan du evt. henvise til en tutorial
Avatar billede disky Nybegynder
26. juni 2001 - 14:01 #3
ikke umiddelbart, men prøv at søg på www.google.com

men har Borland ikke clipboard support indbygget, det ville undre mig hvis den ikke havde
Avatar billede borrisholt Novice
26. juni 2001 - 14:46 #4
cppgames >>


TClipboard classen er svafret på dine spørgsmål. Dog kan du ikke fange når der bliver trykker ctrl+c i hvertfald hvis det er uden for dit program ..... Hvis det er i dit eget program er det nemt nok .....

Smid en knap og et memofelt ind på din form ...
Prøv så det her kode
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  THandle Data = Clipboard()->GetAsHandle(CF_TEXT);
  if (!Data)
    return;

  char *NewData;
  try
  {
    int Size = GlobalSize((void *)Data);
    NewData = new char[Size];
    Clipboard()->GetTextBuf(NewData, Size);
  }
  __finally
  {
    GlobalUnlock((void *)Data);
  }
  Memo1->Lines->Add(NewData);
}


Når der ligger noget text på Clipboarded og du trykker på din knap bliver det smidt ind i bunden af dit memo felt.


Jens B http://fotx.net/borrisholt
Avatar billede borrisholt Novice
26. juni 2001 - 15:39 #5
cppgames >>

Jeg beklager !!! Jeg satte mig ikke ordenligt ind i tingende inden jeg svarede ! Prøv det her i stedet :

En form med et Memo felt. Giv formen et on create event. I private delen af din forms klasse skriver du :

    void * NextHandle;
    void __fastcall WMDRAWCLIPBOARD(TMessage &Message);
    void __fastcall WMCHANGECBCHAIN(TMessage &Message);

    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TMessage, WMDRAWCLIPBOARD)
      MESSAGE_HANDLER(WM_CHANGECBCHAIN, TMessage, WMCHANGECBCHAIN)
    END_MESSAGE_MAP(TComponent)


Så skal vi have diverse metoder implementeret :


void __fastcall TForm1::WMDRAWCLIPBOARD(TMessage &Message)
{

  THandle Data = Clipboard()->GetAsHandle(CF_TEXT);
  if (!Data)
    return;

  char *NewData;
  try
  {
    int Size = GlobalSize((void *)Data);
    NewData = new char[Size];
    Clipboard()->GetTextBuf(NewData, Size);
  }
  __finally
  {
    GlobalUnlock((void *)Data);
  }
  Memo1->Lines->Add(NewData);
  delete NewData;
  SendMessage(NextHandle,WM_DRAWCLIPBOARD,0,0);

}

void __fastcall TForm1::WMCHANGECBCHAIN(TMessage &Message)
{
  if (Message.WParam == (int)NextHandle)
    (int)NextHandle = Message.LParam;
  else
    SendMessage(NextHandle,  WM_CHANGECBCHAIN, Message.WParam, Message.LParam);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  NextHandle = SetClipboardViewer(Handle);
}


Jens B
Avatar billede cppgames Nybegynder
26. juni 2001 - 16:48 #6
borrisholt --> hvordan tømmer jeg det clipboardet indeholder, så det ikke kommer ind i memo feltet
Avatar billede cppgames Nybegynder
26. juni 2001 - 16:48 #7
- når applicationen startes altså
Avatar billede cppgames Nybegynder
27. juni 2001 - 02:15 #8
borrisholt --> vil du ikke være sød og sætte nogle kommentarer på så en nybegynder kan se hvad der foregår?
Avatar billede borrisholt Novice
27. juni 2001 - 09:16 #9
  Clipboard()->Clear();
Tømmer løser dit første problem  ... Her kommer det hele så i gen med kommen tatrer :

//.h
class TForm1 : public TForm
{
__published:    // IDE-managed Components
  TMemo *Memo1;
private:    // User declarations
    void * NextHandle;
    //Handle til det næste vindue i kæden

    void __fastcall WMCHANGECBCHAIN(TMessage &Message);
    //Procedure der skal kaldes når ClipBoard kæden ænderes.
    //windows sender beskeden \'WM_CHANGECBCHAIN\' til alle i ClipBoard kæden
    //når denne ænderes.

    void __fastcall WMDRAWCLIPBOARD(TMessage &Message);
    //procedure der skal kaldes når indholdet af Clipboarded ænderes
    //windows sender beskeden \'WM_DRAWCLIPBOARD\' til alle i ClipBoard kæden
    //når indholded ænderes.


    BEGIN_MESSAGE_MAP
      VCL_MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TMessage, WMDRAWCLIPBOARD)
      VCL_MESSAGE_HANDLER(WM_CHANGECBCHAIN, TMessage, WMCHANGECBCHAIN)
    END_MESSAGE_MAP(TComponent)

    //Slå VCL_MESSAGE_HANDLER op i online hjælpen for en nærmer forklaring
    //I korte træk så sørger denne macro for at den rigtige procedure bliver kaldt
    //når den pågældende besked kommer.

public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};


//.cpp :

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
  Clipboard()->Clear();
  //Tøm Clipboarded.

  NextHandle = SetClipboardViewer(Handle);
  //Put os selv ind i kæden og gem et handle til den næste ....
}
//---------------------------------------------------------------------------


void __fastcall TForm1::WMDRAWCLIPBOARD(TMessage &Message)
{
  THandle Data = Clipboard()->GetAsHandle(CF_TEXT);
  //Ckek of der liger noget text ude på ClipBoardet

  if (!Data)
    return;
  //Hvis der ikke gør det så skrid ud af proceduren.

  char *NewData;
  //Dynamisk buffer til opbevaring af teksten ude på ClipBoardet

  try
  {
    int Size = GlobalSize((void *)Data);
    //Find størelsen på det data vi skal hente.

    NewData = new char[Size];
    //Gør vores buffer stor nok.

    Clipboard()->GetTextBuf(NewData, Size);
    //Kopierer teksten over i vores buffer.
  }
  __finally
  {
    GlobalUnlock((void *)Data);
    //Frigør handlet og der med memory
  }
  Memo1->Lines->Add(NewData);
  //Gør med dit data hvad du ønsker.

  delete NewData;
  //Ryd op efter dig. Din mor kommer ikke og gør det !

  SendMessage(NextHandle,WM_DRAWCLIPBOARD,0,0);
  //Kald næste led i Clipboard  kæden
}

void __fastcall TForm1::WMCHANGECBCHAIN(TMessage &Message)
{
  if (Message.WParam == (int)NextHandle) //Hvis dette er sand så er den næste i kæden hoppet ud
    (int)NextHandle = Message.LParam; //Opdater vored handle til den \'nye\' næste
  else //ellers
    SendMessage(NextHandle,  WM_CHANGECBCHAIN, Message.WParam, Message.LParam); //Send beskeden videre
}


Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester