» Вопросы по Delphi (до версии 2009) - часть 5
Frodo_Torbins
Цитата:
Уже пробовал, все нормально работает. Вопрос в другом:
Цитата:
Цитата:
Чтобы опция "Build with runtime puckages" работала, все должно быть скомпилено в одной версии делфей.
Уже пробовал, все нормально работает. Вопрос в другом:
Цитата:
можно ли указать экзешнику другую папку для этих bpl (devexpress), кроме как корневой каталог программы и system32. Например папку в корневом каталоге программы?
Man_Without_Face
Тогда встречный вопрос: можно ли указать экзешнику другую папку для используемых им dll? Ответ: конечно можно, если прописать ее в переменную окружения "Path".
Тогда встречный вопрос: можно ли указать экзешнику другую папку для используемых им dll? Ответ: конечно можно, если прописать ее в переменную окружения "Path".
Frodo_Torbins
Если можно, то поконкретней где, этих Path довольно много (и в Tools->Options, и в Project->Options). И можно ли это в Delphi 5 сделать?
Если можно, то поконкретней где, этих Path довольно много (и в Tools->Options, и в Project->Options). И можно ли это в Delphi 5 сделать?
Frodo_Torbins
Цитата:
Спасибо, но меня интересует использование в Delphi 7 возможности работы с символьными множествами и строками WideString. Возможно есть какой-то другой способ сохранить символы юникода в Memo после обработки? То есть, допустим, пользователь вставляет в Memo текст в формате юникод и он отображается верно, но после обработки (замены символов, обрезание строк, и .т.д.) он становится уже НЕ-юникодным Как быть?
Цитата:
Все же приведу ссылку на один из своих прошлых постов:
http://forum.ru-board.com/topic.cgi?forum=33&topic=9383&start=1400#18
Спасибо, но меня интересует использование в Delphi 7 возможности работы с символьными множествами и строками WideString. Возможно есть какой-то другой способ сохранить символы юникода в Memo после обработки? То есть, допустим, пользователь вставляет в Memo текст в формате юникод и он отображается верно, но после обработки (замены символов, обрезание строк, и .т.д.) он становится уже НЕ-юникодным Как быть?
eddoc
У меня его примеры прекрасно работают.
Man_Without_Face
Я про системные. Приблизительно: Мой Компьютер -> Свойства -> Дополнительно -> Переменные окружения.
Bonivur
А у вас мемо юникодный?
У меня его примеры прекрасно работают.
Man_Without_Face
Я про системные. Приблизительно: Мой Компьютер -> Свойства -> Дополнительно -> Переменные окружения.
Bonivur
А у вас мемо юникодный?
Frodo_Torbins
А по другому можно как-нибудь, а то так не пойдет? Пока пользователю объясниш...
А по другому можно как-нибудь, а то так не пойдет? Пока пользователю объясниш...
Man_Without_Face
Цитата:
Хм... А если тупо сделать экзешнику ярлык и прописать в его свойствах нужное значение в "рабочая папка"?
Цитата:
можно ли указать экзешнику другую папку для этих bpl
Хм... А если тупо сделать экзешнику ярлык и прописать в его свойствах нужное значение в "рабочая папка"?
psa1974
Мне нужно пользователю, у которого стоит экзешник, просто скинуть DLL (через нет) и все. Или же папку, в которой будут DLL и bpl'ки девок.
Мне нужно пользователю, у которого стоит экзешник, просто скинуть DLL (через нет) и все. Или же папку, в которой будут DLL и bpl'ки девок.
Man_Without_Face
Ну ты хоть попробуй. Если получится - можно за 5 минут наваять элементарный инсталлятор в том же InnoSetup или что больше нравится, который сам скинет куда надо твою ДЛЛ и сделает ярлыки какие надо и где надо... Это вообще не проблема. Если что - помогу с инсталлятором...
Ну ты хоть попробуй. Если получится - можно за 5 минут наваять элементарный инсталлятор в том же InnoSetup или что больше нравится, который сам скинет куда надо твою ДЛЛ и сделает ярлыки какие надо и где надо... Это вообще не проблема. Если что - помогу с инсталлятором...
psa1974
В том то все и дело, что моя только DLL, экзешник ведущего программиста. Он сказал только одну Dll или на крайний случай папку с ней. Я хочу чтобы была поддержка скинов, а для этого нужно собирать динамически. И bpl'ки кидать в папку с Dll, а экзешнику как то нужно туда прописать путь.
В том то все и дело, что моя только DLL, экзешник ведущего программиста. Он сказал только одну Dll или на крайний случай папку с ней. Я хочу чтобы была поддержка скинов, а для этого нужно собирать динамически. И bpl'ки кидать в папку с Dll, а экзешнику как то нужно туда прописать путь.
Frodo_Torbins
Цитата:
Обычный мемо. А какая разница? Изначаль при вставке в него текста он отображает все символы правильно. Да и был бы он юникодным - редактирование "убивает" всю юникодность. У меня временная переменная, куда я помещаю текст Мемо. Обрабатываю, потом помещаю обратно.
Цитата:
А у вас мемо юникодный?
Обычный мемо. А какая разница? Изначаль при вставке в него текста он отображает все символы правильно. Да и был бы он юникодным - редактирование "убивает" всю юникодность. У меня временная переменная, куда я помещаю текст Мемо. Обрабатываю, потом помещаю обратно.
Man_Without_Face
глянь в ПМ...
глянь в ПМ...
Man_Without_Face
Цитата:
Хотя если какой то из пакетов используется лишь вашей DLL, то почему бы не скомпилить ее с этим пакетом?
Bonivur
Для работы с сетами в D2009+ можно использовать несколько библиотек. Попробуйте, может одна из них вам подойдет. А по поводу юникодного мемо гляньте TNTControls.
Цитата:
А по другому можно как-нибудь, а то так не пойдет? Пока пользователю объясниш...Зачем пользователю объяснять? Надо всего лишь чтобы экзешник вызвал функции GetEnvironmentVariable/SetEnvironmentVariable.
Хотя если какой то из пакетов используется лишь вашей DLL, то почему бы не скомпилить ее с этим пакетом?
Bonivur
Для работы с сетами в D2009+ можно использовать несколько библиотек. Попробуйте, может одна из них вам подойдет. А по поводу юникодного мемо гляньте TNTControls.
Frodo_Torbins
Цитата:
Мне нужно для D7 - работа WideString с символьными сетами. То есть, пишу
var
ws: WideString;
...
ws:=Memo1.Text;
if ws[1] in ['a'..'z'] then... //ошибка Incopatible types
Возможно ли как-то заставить работать сеты с WideString?
Цитата:
Для работы с сетами в D2009+ можно использовать несколько библиотек. Попробуйте, может одна из них вам подойдет. А по поводу юникодного мемо гляньте TNTControls.
Мне нужно для D7 - работа WideString с символьными сетами. То есть, пишу
var
ws: WideString;
...
ws:=Memo1.Text;
if ws[1] in ['a'..'z'] then... //ошибка Incopatible types
Возможно ли как-то заставить работать сеты с WideString?
Frodo_Torbins
DLL плохо работает с VCL. Поэтому я не могу скомпилить вместе с ней эти пакеты. В дезайн скины вешаются нормально, но в рантайм они пропадают.
Добавлено:
Frodo_Torbins
Цитата:
Вот попробовал, только ничего не возвращает функция, может что не так делаю?
[more] function SetEnvVarValue(const VarName,
VarValue: string): Integer;
begin
if Windows.SetEnvironmentVariable(PChar(VarName),
PChar(VarValue)) then
Result := 0
else
Result := GetLastError;
end;
function GetDOSEnvVar(const VarName: string): string;
var
i: integer;
begin
Result := '';
try
i := GetEnvironmentVariable(PChar(VarName), nil, 0);
if i > 0 then
begin
SetLength(Result, i);
GetEnvironmentVariable(Pchar(VarName), PChar(Result), i);
end;
except
Result := '';
end;
end;
procedure TfrmMain.cxButton2Click(Sender: TObject);
var g:string;
begin
SetEnvVarValue(g,'D:\Temp\');
showmessage(GetDOSEnvVar(g));
end;[/more]
DLL плохо работает с VCL. Поэтому я не могу скомпилить вместе с ней эти пакеты. В дезайн скины вешаются нормально, но в рантайм они пропадают.
Добавлено:
Frodo_Torbins
Цитата:
Надо всего лишь чтобы экзешник вызвал функции GetEnvironmentVariable/SetEnvironmentVariable.
Вот попробовал, только ничего не возвращает функция, может что не так делаю?
[more] function SetEnvVarValue(const VarName,
VarValue: string): Integer;
begin
if Windows.SetEnvironmentVariable(PChar(VarName),
PChar(VarValue)) then
Result := 0
else
Result := GetLastError;
end;
function GetDOSEnvVar(const VarName: string): string;
var
i: integer;
begin
Result := '';
try
i := GetEnvironmentVariable(PChar(VarName), nil, 0);
if i > 0 then
begin
SetLength(Result, i);
GetEnvironmentVariable(Pchar(VarName), PChar(Result), i);
end;
except
Result := '';
end;
end;
procedure TfrmMain.cxButton2Click(Sender: TObject);
var g:string;
begin
SetEnvVarValue(g,'D:\Temp\');
showmessage(GetDOSEnvVar(g));
end;[/more]
Bonivur
Цитата:
Да, используя сообщение EM_GETTEXTEX. Подробности в MSDN.
Цитата:
Нет. Но конкретно в этом примере:
Код: var
ws: WideString;
...
ws:=Memo1.Text;
if ws[1] in ['a'..'z'] then... //ошибка Incopatible types
Цитата:
Возможно есть какой-то другой способ сохранить символы юникода в Memo после обработки?
Да, используя сообщение EM_GETTEXTEX. Подробности в MSDN.
Цитата:
Возможно ли как-то заставить работать сеты с WideString?
Нет. Но конкретно в этом примере:
Код: var
ws: WideString;
...
ws:=Memo1.Text;
if ws[1] in ['a'..'z'] then... //ошибка Incopatible types
Bonivur
AviDen
Ну, или может есть юникодные библиотки контролов под D7 (я про такие не слышал).
Ну как же - Tnt Unicode Controls, впоследствии купленные TMS и ставшие платными - но на просторах сети все еще можно найти opensource-вариант (это, правда, модифицированная версия - с добавленной поддержкой unicode-сообщений в exception'ы; если надо оргиниальный исходный пакет - могу залить на какой-нить файлообменник).
AviDen
Ну, или может есть юникодные библиотки контролов под D7 (я про такие не слышал).
Ну как же - Tnt Unicode Controls, впоследствии купленные TMS и ставшие платными - но на просторах сети все еще можно найти opensource-вариант (это, правда, модифицированная версия - с добавленной поддержкой unicode-сообщений в exception'ы; если надо оргиниальный исходный пакет - могу залить на какой-нить файлообменник).
Man_Without_Face
проверил твой код. Все отлично работает - вылазит мессага 'D:\Temp\'.
проверил твой код. Все отлично работает - вылазит мессага 'D:\Temp\'.
AviDen
Что-то с EM_GETTEXTEX не получается - видимо контрол не РичЭдит, а Мемо... Проблема не в контроле - Мемо может и отображает Юникод (по-крайней мере те символы, которые мне нужны), но при обработке (даже простейшей) все теряется и обратно уже вставляется без Юникод-символов. Не знаю что делать... Перейти на 2009 не могу - есть компоненты под нее не работающие.
Что-то с EM_GETTEXTEX не получается - видимо контрол не РичЭдит, а Мемо... Проблема не в контроле - Мемо может и отображает Юникод (по-крайней мере те символы, которые мне нужны), но при обработке (даже простейшей) все теряется и обратно уже вставляется без Юникод-символов. Не знаю что делать... Перейти на 2009 не могу - есть компоненты под нее не работающие.
Bonivur
Посмотрите мой последний комментарий на предыдущей странице.
Посмотрите мой последний комментарий на предыдущей странице.
Odysseos
Я посмотрел. Но мне не нужен контрол - у меня и так показывает Юникод символы. Вопрос в обработке текста вне контрола и обратной его вставки. Уже в процесс обработки он становится не-юникод. То есть если в переменную WideString загрузить текст Memo, затем прибавить какой-нибудь символ, вставить обратно в Мемо - юникод теряется. Почему я не могу понять. Изначально-то показывается все нормально. Или я чего не догоняю
Я посмотрел. Но мне не нужен контрол - у меня и так показывает Юникод символы. Вопрос в обработке текста вне контрола и обратной его вставки. Уже в процесс обработки он становится не-юникод. То есть если в переменную WideString загрузить текст Memo, затем прибавить какой-нибудь символ, вставить обратно в Мемо - юникод теряется. Почему я не могу понять. Изначально-то показывается все нормально. Или я чего не догоняю
Bonivur
Всю цепочку преобразований распишите. Ну, то есть - берем строку (какую - ansi или wide, и почему именно ansi или wide), засовываем ее туда-то (куда?), получаем ее оттуда-то (откуда?), как-то анализируем (как?), как-то изменяем (как?), засовываем еще куда-то (куда?) - etc.
Всю цепочку преобразований распишите. Ну, то есть - берем строку (какую - ansi или wide, и почему именно ansi или wide), засовываем ее туда-то (куда?), получаем ее оттуда-то (откуда?), как-то анализируем (как?), как-то изменяем (как?), засовываем еще куда-то (куда?) - etc.
Man_Without_Face
В GetDOSEnvVar должно быть SetLength(Result, i-1). О таких подвохах хорошо написано тут: http://transl-gunsmoker.blogspot.com/2009/09/pchars.html
В GetDOSEnvVar должно быть SetLength(Result, i-1). О таких подвохах хорошо написано тут: http://transl-gunsmoker.blogspot.com/2009/09/pchars.html
Odysseos
Без разницы что делать со строкой. Я закомментил весь код и написал чистый, с нуля "пустой". Уже приводил выше. Но могу опять привести...
var
ws : WideString;
...
ws := Memo1.Text;
ws := ws + 'xxx';
Memo1.Text := ws;
Вообщем, ладно с сетами не пашет WideString, ничего обойдем это, но как из мемо запихнуть текст в WideString и потом обратно вставить в Мемо без потери юникодности? Это вообще реализуемо?
Без разницы что делать со строкой. Я закомментил весь код и написал чистый, с нуля "пустой". Уже приводил выше. Но могу опять привести...
var
ws : WideString;
...
ws := Memo1.Text;
ws := ws + 'xxx';
Memo1.Text := ws;
Вообщем, ладно с сетами не пашет WideString, ничего обойдем это, но как из мемо запихнуть текст в WideString и потом обратно вставить в Мемо без потери юникодности? Это вообще реализуемо?
Bonivur
Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе
Код:
ws := Memo1.Text;
Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе
Код:
ws := Memo1.Text;
Odysseos
Цитата:
Тогда как этот текст получить, сохранив юникодность?
Цитата:
Теряется символы юникода (см. скриншот в моем посте выше). У меня сейчас все в простом string. Но надо чтобы юникод в этом Мемо поддерживался.
Цитата:
Копирование из текстового файла.
Цитата:
Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе
Тогда как этот текст получить, сохранив юникодность?
Цитата:
Зачем вообще здесь работать с unicode'ом? Почему ws - именно WideString, а не просто обычный простой AnsiString?
Теряется символы юникода (см. скриншот в моем посте выше). У меня сейчас все в простом string. Но надо чтобы юникод в этом Мемо поддерживался.
Цитата:
...Интересно - а как изначально в этот memo попадает unicode-текст? Если обычными способами его туда засунуть, в общем, нельзя?
Копирование из текстового файла.
Bonivur
Тогда как этот текст получить, сохранив юникодность?
Из обычного TMemo - никак. Контрол должен поддерживать unicode - а для этого он (его handle, если говорить в терминах WinAPI) должен быть создан особым образом. Пример можно посмотреть в предложенных Tnt Unicode Controls - либо, чтоб не городить огород, просто воспользоваться оными компонентами (там есть готовый TTntMemo, поддерживающий unicode "нативно").
Тогда как этот текст получить, сохранив юникодность?
Из обычного TMemo - никак. Контрол должен поддерживать unicode - а для этого он (его handle, если говорить в терминах WinAPI) должен быть создан особым образом. Пример можно посмотреть в предложенных Tnt Unicode Controls - либо, чтоб не городить огород, просто воспользоваться оными компонентами (там есть готовый TTntMemo, поддерживающий unicode "нативно").
Odysseos
На счет того, что 'xxx' будет ANSI не уверен. По крайней мере в D7 компилятор оказался достаточно умным, чтобы сохранить ее как юникод.
Предложение хотя бы попробовать Tnt Unicode Controls поддерживаю, а то наше обсуждение становится все ближе и ближе к флуду.
На счет того, что 'xxx' будет ANSI не уверен. По крайней мере в D7 компилятор оказался достаточно умным, чтобы сохранить ее как юникод.
Предложение хотя бы попробовать Tnt Unicode Controls поддерживаю, а то наше обсуждение становится все ближе и ближе к флуду.
Frodo_Torbins
Если прямо в тексте выражения - да, но если ее где-то объявить как константу (и не указать, что она : TWideString = 'xxx') - то будет ansi.
Это, впрочем, в данном случае - нюанс совершенно непринципиальный.
Добавлено:
Bonivur
Для работы с WideString в Delphi 2007 (как в предыдущих - не знаю, нет под рукой) есть модуль WideStrUtils.pas, и там есть такая функция:
Код:
...
interface
...
{ in operator support for WideChar }
type
CharSet = set of ansichar;
function inOpSet( W : WideChar; sets : CharSet ) : boolean;
...
implementation
...
function inOpSet( W : WideChar; sets : CharSet ) : boolean;
begin
if W <= #$FF then
Result := Char(W) in sets
else
Result := False;
end;
...
Если прямо в тексте выражения - да, но если ее где-то объявить как константу (и не указать, что она : TWideString = 'xxx') - то будет ansi.
Это, впрочем, в данном случае - нюанс совершенно непринципиальный.
Добавлено:
Bonivur
Для работы с WideString в Delphi 2007 (как в предыдущих - не знаю, нет под рукой) есть модуль WideStrUtils.pas, и там есть такая функция:
Код:
...
interface
...
{ in operator support for WideChar }
type
CharSet = set of ansichar;
function inOpSet( W : WideChar; sets : CharSet ) : boolean;
...
implementation
...
function inOpSet( W : WideChar; sets : CharSet ) : boolean;
begin
if W <= #$FF then
Result := Char(W) in sets
else
Result := False;
end;
...
Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
Предыдущая тема: Clipper 5
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.