Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: eddoc
Дата сообщения: 17.05.2010 00:27
Frodo_Torbins

Цитата:
Примерчик плиз в студию.

вот, делал по рекомендованному
Автор: Man_Without_Face
Дата сообщения: 17.05.2010 08:09
Frodo_Torbins

Цитата:
Чтобы опция "Build with runtime puckages" работала, все должно быть скомпилено в одной версии делфей.

Уже пробовал, все нормально работает. Вопрос в другом:
Цитата:
можно ли указать экзешнику другую папку для этих bpl (devexpress), кроме как корневой каталог программы и system32. Например папку в корневом каталоге программы?



Автор: Frodo_Torbins
Дата сообщения: 17.05.2010 10:01
Man_Without_Face
Тогда встречный вопрос: можно ли указать экзешнику другую папку для используемых им dll? Ответ: конечно можно, если прописать ее в переменную окружения "Path".
Автор: Man_Without_Face
Дата сообщения: 17.05.2010 10:17
Frodo_Torbins
Если можно, то поконкретней где, этих Path довольно много (и в Tools->Options, и в Project->Options). И можно ли это в Delphi 5 сделать?
Автор: Bonivur
Дата сообщения: 17.05.2010 10:30
Frodo_Torbins

Цитата:
Все же приведу ссылку на один из своих прошлых постов:
http://forum.ru-board.com/topic.cgi?forum=33&topic=9383&start=1400#18

Спасибо, но меня интересует использование в Delphi 7 возможности работы с символьными множествами и строками WideString. Возможно есть какой-то другой способ сохранить символы юникода в Memo после обработки? То есть, допустим, пользователь вставляет в Memo текст в формате юникод и он отображается верно, но после обработки (замены символов, обрезание строк, и .т.д.) он становится уже НЕ-юникодным Как быть?
Автор: Frodo_Torbins
Дата сообщения: 17.05.2010 10:34
eddoc
У меня его примеры прекрасно работают.

Man_Without_Face
Я про системные. Приблизительно: Мой Компьютер -> Свойства -> Дополнительно -> Переменные окружения.

Bonivur
А у вас мемо юникодный?
Автор: Man_Without_Face
Дата сообщения: 17.05.2010 10:49
Frodo_Torbins
А по другому можно как-нибудь, а то так не пойдет? Пока пользователю объясниш...
Автор: psa1974
Дата сообщения: 17.05.2010 12:24
Man_Without_Face

Цитата:
можно ли указать экзешнику другую папку для этих bpl

Хм... А если тупо сделать экзешнику ярлык и прописать в его свойствах нужное значение в "рабочая папка"?
Автор: Man_Without_Face
Дата сообщения: 17.05.2010 13:01
psa1974
Мне нужно пользователю, у которого стоит экзешник, просто скинуть DLL (через нет) и все. Или же папку, в которой будут DLL и bpl'ки девок.
Автор: psa1974
Дата сообщения: 17.05.2010 14:10
Man_Without_Face
Ну ты хоть попробуй. Если получится - можно за 5 минут наваять элементарный инсталлятор в том же InnoSetup или что больше нравится, который сам скинет куда надо твою ДЛЛ и сделает ярлыки какие надо и где надо... Это вообще не проблема. Если что - помогу с инсталлятором...
Автор: Man_Without_Face
Дата сообщения: 17.05.2010 14:57
psa1974
В том то все и дело, что моя только DLL, экзешник ведущего программиста. Он сказал только одну Dll или на крайний случай папку с ней. Я хочу чтобы была поддержка скинов, а для этого нужно собирать динамически. И bpl'ки кидать в папку с Dll, а экзешнику как то нужно туда прописать путь.
Автор: Bonivur
Дата сообщения: 17.05.2010 15:03
Frodo_Torbins

Цитата:
А у вас мемо юникодный?

Обычный мемо. А какая разница? Изначаль при вставке в него текста он отображает все символы правильно. Да и был бы он юникодным - редактирование "убивает" всю юникодность. У меня временная переменная, куда я помещаю текст Мемо. Обрабатываю, потом помещаю обратно.
Автор: psa1974
Дата сообщения: 17.05.2010 18:27
Man_Without_Face
глянь в ПМ...
Автор: Frodo_Torbins
Дата сообщения: 17.05.2010 18:41
Man_Without_Face
Цитата:
А по другому можно как-нибудь, а то так не пойдет? Пока пользователю объясниш...
Зачем пользователю объяснять? Надо всего лишь чтобы экзешник вызвал функции GetEnvironmentVariable/SetEnvironmentVariable.
Хотя если какой то из пакетов используется лишь вашей DLL, то почему бы не скомпилить ее с этим пакетом?

Bonivur
Для работы с сетами в D2009+ можно использовать несколько библиотек. Попробуйте, может одна из них вам подойдет. А по поводу юникодного мемо гляньте TNTControls.
Автор: Bonivur
Дата сообщения: 18.05.2010 08:01
Frodo_Torbins

Цитата:
Для работы с сетами в D2009+ можно использовать несколько библиотек. Попробуйте, может одна из них вам подойдет. А по поводу юникодного мемо гляньте TNTControls.

Мне нужно для D7 - работа WideString с символьными сетами. То есть, пишу
var
ws: WideString;
...
ws:=Memo1.Text;
if ws[1] in ['a'..'z'] then... //ошибка Incopatible types
Возможно ли как-то заставить работать сеты с WideString?
Автор: Man_Without_Face
Дата сообщения: 18.05.2010 08:05
Frodo_Torbins
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]
Автор: AviDen
Дата сообщения: 18.05.2010 10:55
Bonivur

Цитата:
Возможно есть какой-то другой способ сохранить символы юникода в Memo после обработки?

Да, используя сообщение EM_GETTEXTEX. Подробности в MSDN.


Цитата:
Возможно ли как-то заставить работать сеты с WideString?

Нет. Но конкретно в этом примере:

Код: var
ws: WideString;
...
ws:=Memo1.Text;
if ws[1] in ['a'..'z'] then... //ошибка Incopatible types
Автор: Odysseos
Дата сообщения: 18.05.2010 11:46
Bonivur
AviDen

Ну, или может есть юникодные библиотки контролов под D7 (я про такие не слышал).

Ну как же - Tnt Unicode Controls, впоследствии купленные TMS и ставшие платными - но на просторах сети все еще можно найти opensource-вариант (это, правда, модифицированная версия - с добавленной поддержкой unicode-сообщений в exception'ы; если надо оргиниальный исходный пакет - могу залить на какой-нить файлообменник).
Автор: psa1974
Дата сообщения: 18.05.2010 12:11
Man_Without_Face
проверил твой код. Все отлично работает - вылазит мессага 'D:\Temp\'.
Автор: Bonivur
Дата сообщения: 18.05.2010 18:38
AviDen
Что-то с EM_GETTEXTEX не получается - видимо контрол не РичЭдит, а Мемо... Проблема не в контроле - Мемо может и отображает Юникод (по-крайней мере те символы, которые мне нужны), но при обработке (даже простейшей) все теряется и обратно уже вставляется без Юникод-символов. Не знаю что делать... Перейти на 2009 не могу - есть компоненты под нее не работающие.
Автор: Odysseos
Дата сообщения: 18.05.2010 19:04
Bonivur

Посмотрите мой последний комментарий на предыдущей странице.
Автор: Bonivur
Дата сообщения: 18.05.2010 19:33
Odysseos
Я посмотрел. Но мне не нужен контрол - у меня и так показывает Юникод символы. Вопрос в обработке текста вне контрола и обратной его вставки. Уже в процесс обработки он становится не-юникод. То есть если в переменную WideString загрузить текст Memo, затем прибавить какой-нибудь символ, вставить обратно в Мемо - юникод теряется. Почему я не могу понять. Изначально-то показывается все нормально. Или я чего не догоняю

Автор: Odysseos
Дата сообщения: 18.05.2010 20:15
Bonivur

Всю цепочку преобразований распишите. Ну, то есть - берем строку (какую - ansi или wide, и почему именно ansi или wide), засовываем ее туда-то (куда?), получаем ее оттуда-то (откуда?), как-то анализируем (как?), как-то изменяем (как?), засовываем еще куда-то (куда?) - etc.
Автор: Frodo_Torbins
Дата сообщения: 18.05.2010 21:13
Man_Without_Face
В GetDOSEnvVar должно быть SetLength(Result, i-1). О таких подвохах хорошо написано тут: http://transl-gunsmoker.blogspot.com/2009/09/pchars.html
Автор: Bonivur
Дата сообщения: 18.05.2010 22:13
Odysseos
Без разницы что делать со строкой. Я закомментил весь код и написал чистый, с нуля "пустой". Уже приводил выше. Но могу опять привести...
var
ws : WideString;
...
ws := Memo1.Text;
ws := ws + 'xxx';
Memo1.Text := ws;

Вообщем, ладно с сетами не пашет WideString, ничего обойдем это, но как из мемо запихнуть текст в WideString и потом обратно вставить в Мемо без потери юникодности? Это вообще реализуемо?
Автор: Odysseos
Дата сообщения: 18.05.2010 22:22
Bonivur

Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе

Код:
ws := Memo1.Text;
Автор: Bonivur
Дата сообщения: 18.05.2010 22:32
Odysseos

Цитата:
Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе

Тогда как этот текст получить, сохранив юникодность?


Цитата:
Зачем вообще здесь работать с unicode'ом? Почему ws - именно WideString, а не просто обычный простой AnsiString?

Теряется символы юникода (см. скриншот в моем посте выше). У меня сейчас все в простом string. Но надо чтобы юникод в этом Мемо поддерживался.


Цитата:
...Интересно - а как изначально в этот memo попадает unicode-текст? Если обычными способами его туда засунуть, в общем, нельзя?

Копирование из текстового файла.
Автор: Odysseos
Дата сообщения: 18.05.2010 23:00
Bonivur

Тогда как этот текст получить, сохранив юникодность?

Из обычного TMemo - никак. Контрол должен поддерживать unicode - а для этого он (его handle, если говорить в терминах WinAPI) должен быть создан особым образом. Пример можно посмотреть в предложенных Tnt Unicode Controls - либо, чтоб не городить огород, просто воспользоваться оными компонентами (там есть готовый TTntMemo, поддерживающий unicode "нативно").
Автор: Frodo_Torbins
Дата сообщения: 18.05.2010 23:09
Odysseos
На счет того, что 'xxx' будет ANSI не уверен. По крайней мере в D7 компилятор оказался достаточно умным, чтобы сохранить ее как юникод.

Предложение хотя бы попробовать Tnt Unicode Controls поддерживаю, а то наше обсуждение становится все ближе и ближе к флуду.
Автор: Odysseos
Дата сообщения: 19.05.2010 00:06
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;
...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.