Schowek systemowy - skuteczne wyczyszczenie

0

Witajcie.
Napotkałem na problem, który uniemożliwia mi zakończenie pracy nad programem. Wrzucam do schowka teksty i niestety schowek skleja mi kolejne wrzucone teksty razem. Próbowałem różnych metod czyszczenia schowka i niestety nic nie działa. Może ktoś podrzuci działający sposób? Z góry dziękuję i pozdrawiam

TClipboard *CB = new TClipboard();
CB->Open();
CB->Clear();

TEdit * ED = new TEdit(MG);
ED->Name = "ED";
ED->Parent = MG;
ED->Text = "tekst";
CB->SetTextBuf(ED->Text.c_str());

CB->Close();

delete CB;
delete ED;

0

Może ktoś podrzuci działający sposób

Nie ma takiej struktury jak schowek w C++ wiec wyczysczenie Twojego schowka moze byc problematyczne. Tylko Ty wiesz jak wyglada Twoj schowek ;)

0
fasadin napisał(a):

Może ktoś podrzuci działający sposób

Nie ma takiej struktury jak schowek w C++ wiec wyczysczenie Twojego schowka moze byc problematyczne. Tylko Ty wiesz jak wyglada Twoj schowek ;)

W takim razie zapytam inaczej. Jak poprawnie skonstruować schowek, żebym miał nad nim kontrolę?

0

Nit nie wie czym ten 'schowek' jest oprócz ciebie gdyż nie dałeś kodu

0
vpiotr napisał(a):

http://forum.lazarus-ide.org/index.php?topic=12383.0

Dziękuję za linka, ale po przeanalizowaniu go i wykonaniu wszystkich porad, problem pozostał nierozwiązany. Pomyślałem jeszcze o tworzeniu nowego schowka z unikalną nazwą dla każdego wrzucania tekstu. Dziękuję wszystkim za pomoc. Chyba, że ktoś ma jeszcze jakieś pomysły, będę wdzięczny.

0

Źle używasz clipboard.
Sam nie powinieneś tworzyć TClipboard, bo schowek jest tylko jeden!
W dokumentacji jest przykład używania TClipboard
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Clipbrd_Clipboard.html
Ciebie interesuje ta część:

  unsigned int DataHandle;
  HPALETTE APalette;
  unsigned short MyFormat;
  std::auto_ptr<Graphics::TBitmap> Bitmap(new Graphics::TBitmap());
  try
  {
    Bitmap->LoadFromFile("C:\\Program Files\\Common Files\\CodeGear Shared\\Images\\Splash\\256Color\\FACTORY.BMP");
    // generate a clipboard format, with data and palette
    Bitmap->SaveToClipboardFormat(
      MyFormat,
      DataHandle,
      APalette);
    // save the data to the clipboard using that format and
    // the generated data
    Clipboard()->SetAsHandle(MyFormat,DataHandle);
  }
  catch (...)
  {
     ShowMessage("Failed to copy image to clipboard!");
  }

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Clipbrd_TClipboard.html

Do not instantiate separate TClipboard objects by calling the constructor.
Instead, use the global instance of TClipboard returned by the Clipboard function.

0
emptii napisał(a):

Witajcie.
Napotkałem na problem, który uniemożliwia mi zakończenie pracy nad programem. Wrzucam do schowka teksty i niestety schowek skleja mi kolejne wrzucone teksty razem. Próbowałem różnych metod czyszczenia schowka i niestety nic nie działa. Może ktoś podrzuci działający sposób? Z góry dziękuję i pozdrawiam

TClipboard *CB = new TClipboard();
CB->Open();
CB->Clear();

TEdit * ED = new TEdit(MG);
ED->Name = "ED";
ED->Parent = MG;
ED->Text = "tekst";
CB->SetTextBuf(ED->Text.c_str());

CB->Close();

delete CB;
delete ED;

EmptyClipboard;

0
MarekR22 napisał(a):

Źle używasz clipboard.
Sam nie powinieneś tworzyć TClipboard, bo schowek jest tylko jeden!
W dokumentacji jest przykład używania TClipboard
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Clipbrd_Clipboard.html
Ciebie interesuje ta część:

  unsigned int DataHandle;
  HPALETTE APalette;
  unsigned short MyFormat;
  std::auto_ptr<Graphics::TBitmap> Bitmap(new Graphics::TBitmap());
  try
  {
    Bitmap->LoadFromFile("C:\\Program Files\\Common Files\\CodeGear Shared\\Images\\Splash\\256Color\\FACTORY.BMP");
    // generate a clipboard format, with data and palette
    Bitmap->SaveToClipboardFormat(
      MyFormat,
      DataHandle,
      APalette);
    // save the data to the clipboard using that format and
    // the generated data
    Clipboard()->SetAsHandle(MyFormat,DataHandle);
  }
  catch (...)
  {
     ShowMessage("Failed to copy image to clipboard!");
  }

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Clipbrd_TClipboard.html

Do not instantiate separate TClipboard objects by calling the constructor.
Instead, use the global instance of TClipboard returned by the Clipboard function.

Dziękuję za kod, potrzebuję teraz tylko przerobić go na wrzucanie do schowka tekstu, grafiki nie wrzucam w tym programie.

0
wil napisał(a):
emptii napisał(a):

Witajcie.
Napotkałem na problem, który uniemożliwia mi zakończenie pracy nad programem. Wrzucam do schowka teksty i niestety schowek skleja mi kolejne wrzucone teksty razem. Próbowałem różnych metod czyszczenia schowka i niestety nic nie działa. Może ktoś podrzuci działający sposób? Z góry dziękuję i pozdrawiam

TClipboard *CB = new TClipboard();
CB->Open();
CB->Clear();

TEdit * ED = new TEdit(MG);
ED->Name = "ED";
ED->Parent = MG;
ED->Text = "tekst";
CB->SetTextBuf(ED->Text.c_str());

CB->Close();

delete CB;
delete ED;

EmptyClipboard;

Próbowałem tego już wcześniej i niestety bez zmian :) dziękuję.

0
emptii napisał(a):
wil napisał(a):
emptii napisał(a):

Witajcie.
Napotkałem na problem, który uniemożliwia mi zakończenie pracy nad programem. Wrzucam do schowka teksty i niestety schowek skleja mi kolejne wrzucone teksty razem. Próbowałem różnych metod czyszczenia schowka i niestety nic nie działa. Może ktoś podrzuci działający sposób? Z góry dziękuję i pozdrawiam

TClipboard *CB = new TClipboard();
CB->Open();
CB->Clear();

TEdit * ED = new TEdit(MG);
ED->Name = "ED";
ED->Parent = MG;
ED->Text = "tekst";
CB->SetTextBuf(ED->Text.c_str());

CB->Close();

delete CB;
delete ED;

EmptyClipboard;

Próbowałem tego już wcześniej i niestety bez zmian :) dziękuję.

Zatem jakichś śmieci używasz, zamiast poprawnego kodu.

Typowy scenariusz kopiowania do schowka:

if ( OpenClipboard(HWindow) && EmptyClipboard() )

    HANDLE hmem = GlobalAlloc(GHND, sizdata); // jakiś tam ident, reprezentujący kawałek ramu w windows

    char *p = GlobalLock(hmem); // to jest adres do tego zarezerwowanego wcześniej obszaru pamięci 

   //  następnie wsadzasz dane do tego ramu pod p, np. tak:

    for(i = 0; i < n; i++) {
      p += GetString(p, i)); // kopiujemy jakieś tam linie tekstu, np. z ListBox,
      *p++ = '\n'; *p++:= '\r'; // nowa linia
    } // end for;

    *p = 0; // koniec tekstu

    GlobalUnlock(hmem); // odblokowujemy...

    SetClipboardData(CF_TEXT, hmem); // wsadzamy...
    CloseClipboard(); // i zamykamy

}

https://msdn.microsoft.com/en-us/library/windows/desktop/ff468802(v=vs.85).aspx

Sprawdź co robi ten obiekt: TClipboard i dostosuj się odpowiednio - do tego kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1