Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 16:36   #1
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
Вопрос Копирование текста в буфер в Windows 7

Доброе время суток!

Мне нужно скопировать путь к программе в буфер.
Делаю так:
Код:
Clipboard.SetTextBuf(PChar(paramstr(0)));
В пути могут может использоваться кириллица!
Когда вставляю из буфера под Windows XP текст отображается корректно, но когда программа загружена под Windows 7 начинаются проблемы с кодировкой! Русские буквы становятся не читабельны.
Пробовал конвертировать текст в unicode:
Код:
var wideChars:array[0..High(word)] of WideChar; myString:string;
...
      myString:=paramstr(0);
      StringToWideChar(myString,wideChars,Length(paramstr(0))+1);
      Clipboard.SetTextBuf(PChar(wideChars));
...
но это помогает
Подскажите в чём моя ошибка?
DemonXT вне форума Ответить с цитированием
Старый 10.04.2011, 16:38   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Версию Delphi может скажешь?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 10.04.2011, 16:53   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Код:
unit Unit2;

interface

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

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

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  myDir: AnsiString;
begin
  myDir:=ExtractFilePath(ParamStr(0));
  Clipboard.AsText:=myDir;
end;
Так, не?
Человек_Борща вне форума Ответить с цитированием
Старый 11.04.2011, 08:34   #4
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Версию Delphi может скажешь?
Delphi 2006
Человек_Борща,
неработате как надо в Windows 7
DemonXT вне форума Ответить с цитированием
Старый 11.04.2011, 10:20   #5
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Когда копируете, следите чтобы была выставлена русская раскладка на клаве.
eduard93 вне форума Ответить с цитированием
Старый 11.04.2011, 15:26   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от DemonXT Посмотреть сообщение
Delphi 2006
И что, по-твоему, принимает SetTextBuf?

Я тебе скажу - он принимает Ansi-строчку.

Тебе даже компилятор должен был сказать, что ты написал ерунду - трактуешь unicode как ansi и ждёшь, что это будет работать.

Тебе надо вызывать WinAPI напрямую.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.04.2011, 19:39   #7
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
По умолчанию

Во общем нашёл рабочий вариант. Может кому ещё поможет:
Код:
procedure TextToClipboard(const sSrt:string);
var N:Integer; mem:Cardinal; ptr:Pointer;
begin
  with Clipboard do try
    Open;
    if IsClipboardFormatAvailable(CF_UNICODETEXT) then
    begin
      N:=(Length(sSrt)+1)*2;
      mem:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,N);
      ptr:=GlobalLock(mem);
      Move(PWideChar(widestring(sSrt))^, ptr^,N);
      GlobalUnlock(mem);
      SetAsHandle(CF_UNICODETEXT,mem);
    end;
    AsText:=sSrt;
    mem:=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,SizeOf(dword));
    ptr:=GlobalLock(mem);
    dword(ptr^):=(SUBLANG_NEUTRAL shl 10) or LANG_RUSSIAN;
    GlobalUnLock(mem);
    SetAsHandle(CF_LOCALE,mem);
  finally Close;
  end;
end;
DemonXT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование в буфер обмена motorway JavaScript, Ajax 1 10.04.2011 07:36
Копирование данных в буфер обмена? ArcticBear Общие вопросы .NET 4 27.11.2009 14:27
Копирование в буфер обмена Xanex Общие вопросы Delphi 5 18.05.2009 23:13
Копирование в буфер Windows NeiL Общие вопросы Delphi 3 23.04.2008 21:46
Копирование структуры в буфер обмена bill Общие вопросы Delphi 14 20.11.2007 17:22