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

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

Автор: anfilat
Дата сообщения: 25.09.2008 08:58
TechnoDreamer
Попробуй вручную копировать строку. Примерно так:
SetLength(str1, length(str2))
Move(str2^, pointer(str1)^, length(str2) * SizeOf(WideChar))
Автор: Maks150988
Дата сообщения: 25.09.2008 15:51
sergiuz1303
Да мне и 7 версия вполне подходит. =)
Mandor Sawall
Да я вообще увидел этот пример на каком-то программерском сайте (форум сурсес.ру вроде). Вот просто решил (что в результате функция возвращает) к функции приделать чтоб вайдстринг возвращала. Там был намек на то что такой подход возвращает такими манимуляциями не анси строку. Ну я и подумал что раз не анс, значит результат вайдстринговый у функции должен быть, да плюс в меню функция добавления строки с буквой w. Хотя бы дайте ссылки как сделать юникодовое приложение, ну или поправьте как должно быть. =)
Автор: Mandor Sawall
Дата сообщения: 26.09.2008 08:28
Maks150988
А тот вариант, которой написал, не работает?
Автор: Maks150988
Дата сообщения: 27.09.2008 10:58
Mandor Sawall
Работает. Но я проверить то не могу как на китайской системе, допустим, все это пойдет... Хотелось бы тогда какие-нибудь гарантии. =)
На немецком форуме программистов нашел функцию:


Код:
function AnsiToWide(Text : AnsiString; Charset : Cardinal) : WideString;
var
I : TCharsetInfo;
L : Integer;
begin
TranslateCharsetInfo(Charset, I, TCI_SRCCHARSET);
L := MultiByteToWideChar(I.ciACP, MB_PRECOMPOSED, @Text[1], Length(Text), nil, 0);
SetLength(Result, L);
MultiByteToWideChar(I.ciACP, MB_PRECOMPOSED, @Text[1], Length(Text), @Result[1], L);
end;
Автор: Frodo_Torbins
Дата сообщения: 27.09.2008 15:32
Maks150988
Подозреваю, что вместо CP_UTF8 должна быть кодировка, в которой закодирована STRING_ABOUT, наверно CP_1251. Но вариант, предложенный Mandor Sawall мне нравится намного больше, т к он во-первых надежнее, а во-вторых не требует лишнего кода.
Автор: Mandor Sawall
Дата сообщения: 29.09.2008 08:34
Maks150988
Frodo_Torbins совершенно прав - вместо CP_UTF8 должно быть CP_1251. Но такой вариант - просто лишьные сложности.

В общем, принцип такой - если хотите делать unicode-программа, забудьте про AnsiString и използуйте только WideString. Конверсия через AnsiToWide будет нужна только если к вам приходят какие-то внешные AnsiStrings, но тогда должны знать кодировку.
Автор: Antananarivu
Дата сообщения: 30.09.2008 10:47
Проблема такая, кидаю на форму компонент AntiFreeze, а форма все равно умирает, совершенно не обновляется. Я знаю, что Indy вообще кривая штука, но не настолько же? Может, быть я все таки что то не так делаю? Проблема появилась в Indy 10, в Indy 9 - форма хоть и с глюками, но регулярно перерисовывалась и не висла.
Сама прога скачивает по POP3 сообщения и сохраняет вложения. Заранее спасибо.
Автор: Frodo_Torbins
Дата сообщения: 30.09.2008 12:33
Antananarivu
Возможно эта статья: Выполнение кода в потоке без выделения его в процедуру поможет выделить тормозящий код в отдельный поток?
Автор: Antananarivu
Дата сообщения: 30.09.2008 14:08
О Да! Спасибо огромное!
Автор: mihmig
Дата сообщения: 30.09.2008 22:02
Есть такая программа EssentialPIM
http://forum.ru-board.com/topic.cgi?forum=5&topic=24849
(органайзер)
смысл ее не важен, главное что в папке с исполняемым файлом лежит файл с данными
например test.epim (как оказалось БД в формате Firebird) и (!) один файл gds32.dll
Т.е. программа полноценно работает с БД используя только одну dll-ку! Без всяких BDE и серверов!
Хочу так-же!
Не ткнет ли кто носом в работающий пример?

Автор: DmitryKz
Дата сообщения: 30.09.2008 22:20
mihmig
Она использует БД Firebird Embedded. Скачиваешь такой дистрибутив с оффсайта и будет также
Автор: extasy
Дата сообщения: 01.10.2008 06:28
механизм планирования выполнения заданий: Round Robin

не подскажете, как реализовать сие?
Автор: afiget
Дата сообщения: 01.10.2008 09:39
extasy
http://www.delphi3000.com/articles/article_1896.asp?SK=
Автор: extasy
Дата сообщения: 01.10.2008 12:21
afiget
Да, я тоже это находил. Смущает что "Category: Games". И не совсем понятно что там относится к гейм, а что к механизму планирования
Автор: fcdobpiy
Дата сообщения: 01.10.2008 12:42
mihmig

тебе нужны компоненты прямого доступа к базе данных. самые популярные, но шароварные, для интербеза (фаербеда) это fibplus
ну и плюс Firebird Embedded как писал DmitryKz
Автор: Antananarivu
Дата сообщения: 01.10.2008 13:29
Здравствуйте!
Вопрос связан с плохим пониманием функции синхронизации потоков.
Вопрос такой: У меня есть два потока. В одном из них я (по нажатию клавиши) присваиваю переменной какое-то значение (с: integer - присваиваю значение 25). Во втором потоке в процедуре имеется проверка: if c=25 тогда я отсоединяюсь от pop сервера и заканчиваю скачку почты.
Вопрос такой, нужна ли в данном случае процедура synchronize? Нужна ли синхронизация потоков? То есть может ли глюкануть программа, если первый поток будет присваивать переменной значение, как раз в тот момент когда второй поток проверяет ее значение?
Заранее спасибо!
Автор: delover
Дата сообщения: 01.10.2008 15:49
Antananarivu
Книга по Win2000 сервер содержит много примеров реализации семафоров критических секций и даже использование системного журнала. Лучше копать в этом направлении.
Автор: Antananarivu
Дата сообщения: 01.10.2008 16:30
Спасибо... еще такой наверное глупый вопрос:
По какому принципу в PopupMenu нумеруются Items. Самый верхний нулевой, а дальше по порядку?
PopupMenu1.Items[0].Enabled:=false;
PopupMenu1.Items[1].Enabled:=false;
PopupMenu1.Items[2].Enabled:=true;
А что если я через какое то время решу добавить еще один пункт и поставить его на самый верх, нумерация изменится? То есть бывший Items[0] станет Items[1] и т.д. Соответственно придется переписывать код?
Где я не прав и как этого избежать? Заранее спасибо!
Автор: Jokerjar79
Дата сообщения: 02.10.2008 04:59
Items также имеют свои имена (по-умолчанию N1, N2 и т.д.) можно обращаться по имени (N1.Enabled := true)
Автор: anfilat
Дата сообщения: 02.10.2008 08:40
Antananarivu
В твоем случае синхронизация не нужна. Она была бы нужна если бы переменная была длиннее четырех байт (строка или дата например), или если бы оба потока считывали и записывали в нее. А когда один только пишет, а второй только читает - все будет работать без проблем.
Автор: Dimoniusis
Дата сообщения: 02.10.2008 09:06
Antananarivu по вложенности


Код:
Файл Правка Справка
Открыть Копировать
Выход Вставить
Автор: delover
Дата сообщения: 02.10.2008 10:38
Antananarivu
А какой случай то?
a) Пишете экземпляр в учебник.
б) Расчитываете на VirtualPC, dotNet, и разные процессоры
(Ну если представлять шину данных в связи с памятью, то так и будет. Всвязи с кешем процессора, я бы тут притормозил. Устанавливал win2000 на старый пентиум - ошибка установки. Отключил кэш процессора - установка прошла полностью.)
в) Филосовский вопрос, - ну по win32, так это в кибернетике макроподход, когда ты ничего не знаешь, что там внутри может находится. NT конечно защитит чужие процессы, но не гарантирует работоспособность процесса использующего "ненадёжные" техники программирования.
Автор: anfilat
Дата сообщения: 02.10.2008 11:41
delover

Цитата:
А какой случай то?

Я так понимаю вопрос был ко мне? Запись и чтение четырехбайтной выравненной переменной это атомарная операция на x86 процессорах и в дополнительной синхронизации не нуждается.

Цитата:
a) Пишете экземпляр в учебник.

Рихтер уже все написал.

Цитата:
б) Расчитываете на VirtualPC, dotNet, и разные процессоры

Я так понял речь шла про нормальную программу. а не про извращения вроде dotNet. А процессоры бывают только x86. Во всяком случае дельфийский компилятор расчитан только на них.

Цитата:
в) Филосовский вопрос, - ну по win32, так это в кибернетике макроподход, когда ты ничего не знаешь, что там внутри может находится. NT конечно защитит чужие процессы, но не гарантирует работоспособность процесса использующего "ненадёжные" техники программирования.

Это надежная техника программирования. В самом деле.
Автор: Antananarivu
Дата сообщения: 02.10.2008 14:36
anfilat

Скажите, пожалуйста, а где можно почерпнуть такую подробную информацию: при каких размерах переменной и при каких конкрентно действиях нужна синхронизация, а при каких не нужна? Какие операции атомарные, а какие нет?
Откуда это можно узнать?

Добавлено:
Dimoniusis

А если, скажем через месяц я решу, что на первом месте в моем меню должна быть позиция "Настройки".
Я сделаю так:
Menu1.Items[0].Caption =>Настройки
И после этого мне придется заново переделывать кучу кода, так как произошло смещение нумерации на одну позицию:
Menu1.Items[1].Caption =>Файл
Menu1.Items[1].Items[0].Caption => Открыть
Menu1.Items[1].Items[1].Caption => Выход
Menu1.Items[2].Caption =>Правка
Menu1.Items[2].Items[0].Caption => Копировать
Menu1.Items[2].Items[1].Caption => Вставить
Menu1.Items[3].Caption =>Справка

Автор: delover
Дата сообщения: 02.10.2008 15:23
anfilat

Цитата:
Я так понял речь шла про нормальную программу. а не про извращения вроде dotNet.

А я думал IUnknown придумали люди понимающие что-то в "надёжной" технике.

ps.
Уверен, что ничего не понял. Что лучше, Вам, как говориться виднее.
Автор: Antananarivu
Дата сообщения: 02.10.2008 16:02
Еще одна проблема возникла... мне уже неудобно спрашивать...
Свернул я программу в трей, по нажатию правой кнопкой мыши всплывает popupmenu. И вот с ним возник один неприятный глюк.
Моя программа начинает работать по таймеру. Допустим программа в трее, я нажал правой кнопкой мыши и вижу popupmenu, в этот момент срабатывает таймер - он запускает программу и одновременно делает неактивными некоторые строки popupmenu. И вот после этого popupmenu "виснет" - нажать на активные пункты меню в нем нельзя, при повторном нажатии на значок трея правой кнопкой мыши меню вообще перестает появлятся.
Как избавится от такого глюка...
Автор: RSoFT1978
Дата сообщения: 02.10.2008 18:35
Antananarivu, как вариант можно принудительно закрывать меню при срабатывании таймера (или блокировать срабатывание таймера при открытом меню).
Автор: Antananarivu
Дата сообщения: 02.10.2008 19:01
RSoFT1978
Как программно принудительно закрыть меню?

Добавлено:
И еще предположение, по таймеру программа (после того, как сделала неактивными строки меню) уходит в параллельный поток, может в этом дело?
Автор: RSoFT1978
Дата сообщения: 02.10.2008 21:37
Antananarivu, попробуйте popupmenu1.FreeOnRelease (если я правильно помню, сейчас не имею возможности проверить)
Автор: Frodo_Torbins
Дата сообщения: 02.10.2008 22:57
Antananarivu

Цитата:
И еще предположение, по таймеру программа (после того, как сделала неактивными строки меню) уходит в параллельный поток, может в этом дело?

Возможно да. А что у вас за таймер, мне кажется стандартный не должен срабатывать, пока открыта менюшка?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


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