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

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

Автор: delover
Дата сообщения: 18.09.2008 07:19
Иногда помогает разделить проект на два и реже возвращаться к глючащим задачам.
Нашёл в хрестоматии
[more=работа с деревом]
Код: [no]
unit TreeForm;

...

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TreeView1.SaveToFile (
ExtractFilePath (Application.ExeName) + 'TreeText.txt');
end;

procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
TreeView1.BeginDrag (False);
end;

procedure TForm1.ExpandAll1Click(Sender: TObject);
begin
// either:
TreeView1.FullExpand;
// or:
// TreeView1.Items [0].Expand(True);
end;

end.
[/no]
Автор: delover
Дата сообщения: 19.09.2008 10:41
Frodo_Torbins

Цитата:
поставить логер типа EurekaLog или MadExcept.

А они бесплатные? Скачал MadExcept, но разбираться как его устанавливать - пока некогда.
Автор: OJIR
Дата сообщения: 19.09.2008 10:50
Каким образом организовать формат вывода в Edit?

Допустим, ввожу 1000000, а в Edit отображается 1 000 000
Автор: DmitryKz
Дата сообщения: 19.09.2008 11:27
OJIR
А если использовать MaskEdit?
Автор: Coltrain
Дата сообщения: 19.09.2008 11:35
OJIR

Цитата:
Каким образом организовать формат вывода в Edit?

Допустим, ввожу 1000000, а в Edit отображается 1 000 000


Я так понимаю дата-контролы не используются и надо организовать форматный вывод в обыкновенный TEdit? (не TDBEdit) Тогда надо каким нибудь образом отлавливать событие окончания воода в Edit информации, например на OnKeyUp или лучше на потерю фокуса OnExit. Достать из Edit-а введеную юзером информацию, отформатировать ее как надо и положить назад. Для форматирования в твоем случае хорошо подойдёт функция FormatFloat. Весь код будет выглядеть примерно так:

var
tmpReal : real;
begin
tmpReal := StrToFloat(Edit1.Text);
Edit1.Text := FormatFloat('#,###,##0', tmpReal);
end;

Но, имхо, есл критично представление данных, проще использовать дата-контролы вроде TDBEdit и данные хранить в таблице.
Автор: OJIR
Дата сообщения: 19.09.2008 12:21
Coltrain

Работает.

Но когда я возвращаюсь в Edit, не вношу ни каких изменений, либо изменю одну цифру,то при потере фокуса выдается сообщение об ошибке

'число из Edit' is not a valid floating point value
Автор: Coltrain
Дата сообщения: 19.09.2008 12:43
OJIR


Цитата:
Но когда я возвращаюсь в Edit, не вношу ни каких изменений, либо изменю одну цифру,то при потере фокуса выдается сообщение об ошибке

'число из Edit' is not a valid floating point value


Ну да . При повторном выходе функция StrToFloat уже не может корректно перевести строку '1 000 000' в вещественное значение. Выход вижу в следующем: хранить редактируемое в Edit значение в отдельной переменной и при заходе в Edit на событие OnExit восстанавливать из него значение для Edit.Text. Ну примерно так:

1. объявляем переменную для хранения редактируемого в Edit значения
...
private
FEditValue : real;
...
2. делаем реакцию на получение фокуса эдитом

procedure TForm1.Edit1Enter(Sender: TObject);
begin
Edit1.Text := FloatToStr(FEditValue);
end;

3. немного меняем реакцию на потерю фокуса

procedure TForm1.Edit1Exit(Sender: TObject);
begin
FEditValue := StrToFloat(Edit1.Text);
Edit1.Text := FormatFloat('#,###,##0', FEditValue);
end;

4. ну и напоследок, чтобы предотвратить нажатие юзером не цифровых клавиш, определим OnKeyPress

Procedure TForm1.Edit1KeyPress(Sender: TObject; Var Key: Char);
Begin
If Not (Key In ['0'..'9', #8, '.']) Then
Begin
Key := #0;
MessageBeep($FFFF);
End;
End;

Должно сработать...
Автор: OJIR
Дата сообщения: 19.09.2008 12:51
Coltrain

Спасибо. Разобралась.
Автор: Frodo_Torbins
Дата сообщения: 19.09.2008 17:12
delover
Такие классные вещи не могут быть бесплатными Но с помощью этих штук 99% багов любого проекта можно прибить и за триальный период.
Автор: AJM
Дата сообщения: 20.09.2008 21:22
Ребята,такой вопрос : у меня есть одна прога напечатаная delphi,она выдает мне ID,я этот ID должен кому-то послать чтоб мне выдали NAME, и Acess keyкоторый я должен ввести в окошке.., можна ли через делфи убрать это? и как?
Автор: Erazer
Дата сообщения: 22.09.2008 18:28
"Настоящие программисты пробелов не используют "
если я пытаюсь восстановить ключ типа "\Software\Microsoft\Windows Mail" то нифига не получается

Res := R.RestoreKey('\Software\Microsoft\Windows Mail', 'C:\WM1.reg');

Не срабатывает. Если создать "\Software\Microsoft\WindowsMail" то

Res := R.RestoreKey('\Software\Microsoft\WindowsMail', 'C:\WM2.reg');

работает. Из чего делаем вывод что проблема в пробеле... Мож кто знает как побороть ?
Автор: akaGM
Дата сообщения: 22.09.2008 18:54
Erazer
а ключ "Windows Mail" в этой ветке точно есть?
Автор: Coltrain
Дата сообщения: 22.09.2008 19:19
Erazer
Попробуй заюзать API-шную функцию RegRestoreKey
Автор: Erazer
Дата сообщения: 22.09.2008 19:24
akaGM
естественно.... я уж столько перепробовал. дело не в этом ключе а в принципе - если есть пробел в имени ключа он считается концом строки, все что дальше не воспринимается
Автор: akaGM
Дата сообщения: 22.09.2008 19:37
Erazer
попробуй:
1. '"\Software\Microsoft\Windows Mail"'
2. '\Software\Microsoft\Windows Mail'#0
3. или на халяву:
var
sKey: string;
...
sKey := '\Software\Microsoft\Windows Mail';
RestoreKey(sKey, filename);

иначе -- хз...

Coltrain
RestoreKey() и есть обёртка над RegRestoreKey()
Автор: Erazer
Дата сообщения: 22.09.2008 21:14
спасибо......все оказалось гораздо интереснее.... Проблема не в пробеле. В Vista, мне не удавалось восстановить ветку реестра до тех пор, пока я не экспортировал ее в файл, не удалил, а потом не добавил снова в реестр, после этого я могу не только сохранять но и восстанавливать эту ветку из программы, до этого не получалось. Ниче не понял: разрешения всроде остались те же что и были, что же меняет удаление ветки и восстановление из reg файла ?
Автор: akaGM
Дата сообщения: 22.09.2008 22:03
Erazer
Цитата:
что же меняет удаление ветки и восстановление из reg файла ?

Цитата:
Проблема не в пробеле.

Цитата:
Проблема ... В Vista.

постарался ответить твоими же цитатами гы...

---
а reg какой, юникод или старенький NT REGEDIT4?
Автор: Erazer
Дата сообщения: 22.09.2008 22:25
решил.

Добавлено:
akaGM проблема не в том была.. сначала удаляем ветку которую бум восстанавливать, затем создаем все разделы, а уж тока потом RestoreKey(sKey, filename);
Кажись что-то подобное написано на сайте мелкософта, но только там , так многа букаф, и все по буржуински... Так чт оесли это прописная истина, напишите плз буду хоть знать...
Автор: DmitryKz
Дата сообщения: 23.09.2008 07:53
Ребята, какой примерно существует алгоритм определения языка текста (в Юникоде)? И как достать те локали, которые прописаны в Винде, для заполнения, скажем, списка в КомбоБоксе.
Автор: delover
Дата сообщения: 23.09.2008 09:48
Лучше запрашивать у винды раскладки клавиатуры. Думаю что если раскладка имеется то и зачит юникод может быть "без поддержки юникода".

Добавлено:
Frodo_Torbins
Пока не знаю, может откажусь от идеи в пользу первоначального варианта в котором пофигу на количество памяти, так как видимо, что совершенного варианта мне не найти. Из лени приходится использовать компанеты, которые не совсем удачные. Ну не переписывать же их каждый раз. В общем не знаю как экзепшены в пакетах ловить, в идеехе. Там вроде CodeHook надо, а чего-то предупреждение про антивирь большое.
Автор: anfilat
Дата сообщения: 23.09.2008 11:23
DmitryKz
Список локалей дает функция Languages() из SysUtils.

А по поводу определения языка текста - ты хочешь алгоритм, который мог бы определить английский текст у тебя или фрунцузский? Или что-то попроще?
Автор: DmitryKz
Дата сообщения: 23.09.2008 15:16
anfilat
Не совсем. Есть текст, в котором встречаются латинские, греческие и еврейские слова или словосочетания. Основной язык текста - русский или английский. Вот и нужно определять среди основного теста язык отдельных слов. Ну, латинский, наверно, можно считать все равно что английским, или я не прав?

Добавлено:
anfilat
Не совсем. Есть текст, в котором встречаются латинские, греческие и еврейские слова или словосочетания. Основной язык текста - русский или английский. Вот и нужно определять среди основного теста язык отдельных слов. Ну, латинский, наверно, можно считать все равно что английским, или я не прав?
Автор: anfilat
Дата сообщения: 23.09.2008 16:16
DmitryKz
Посмотри в JCL JclUnicode.pas. Там есть функция CodeBlockFromChar, которая возвращает такие константы как ubCyrillic и ubHebrew.
Автор: deadbitch
Дата сообщения: 24.09.2008 09:21
Товарищи, пользуюсь Дельфи давно и все как-то было не досуг, но счас достало: можно ли сохранять букмарки в CodeEditor-е? Или это только у меня они пропадают после закрытия?
Автор: delover
Дата сообщения: 24.09.2008 09:54
deadbitch
А autosave options|project desktop пробовал?
Автор: deadbitch
Дата сообщения: 24.09.2008 10:06
delover

Цитата:
А autosave options|project desktop пробовал?


Ты перевернул мой мир.. блин.
Автор: Maks150988
Дата сообщения: 24.09.2008 20:28
Хочется в программе использовать юникод. И собственно застрял чуть ли не в самом начале. =( Даже не знаю то ли система может не поддерживает (ИксПи СП3), то ли я чего-то неправильно делаю, то ли в системе настроено все так...
Вобщем задача - отобразить юникод строчку в пункте меню. Сделал функцию

function AnsiToWide(aString : String) : WideString;
begin
Result := WideCharToString(PWideChar(aString));
end;

Ну и попытался всунуть текст:
STRING_ABOUT : string = 'О программе...';

AppendMenuW(hSysMenu, MF_BYPOSITION, CONTEXT_ABOUT, PWideChar(AnsiToWide(STRING_ABOUT)));

В поисковике часто видел ссылки на функцию MultiByteToWideChar, но там какой-то левый пример один и тот же постоянно попадался.
Вобщем имею врезультате вместо нормального отображения символов вопросительные знаки в пункте меню. Как правильнее переконвертировать? Спасибо. =)
Автор: sergiuz1303
Дата сообщения: 24.09.2008 21:11
Maks150988
Переходи на Д2009 там есть поддержка Юникоида, встроенная.
Автор: TechnoDreamer
Дата сообщения: 25.09.2008 00:33
В общем есть некая либа написанная на сях. Она передает юникодную строку через PWideChar.
В коде у меня так:

var
str1:WideString;
str2:PWideChar;

str2 это то что передает либа. str1 это то чем я пользуюсь у себя.

использую обычное присвоение:
str1:=str2;

И всё нормально, но только на отностительно небольших строках. Но на более менее больших строках (даже на 200КБ) на этом присвоение вылетает:
EAccesViolation in module 'oleaut32.dll'

Видимо я как то с ними неправильно работаю. Подскажите в чем ошибка?

Delphi2007
Автор: Mandor Sawall
Дата сообщения: 25.09.2008 08:46
Maks150988
А вы сначала определитесь, что хотите делать. Ваша функция AnsiToWide очень странная: получаете какой-то AnsiString (параметр aString), и говорите компилятору, что ето WideString (хотя он вообще не такой). Потом етот псевдо-WideString делаете на AnsiString (через WideCharToString) и возвращаете результат как WideString. Совсем непонятно...
Вообще, конверсия из Ansi в Unicode нееднозначна и поетому зависима от текущий Locale. Рекомендую посмотреть TNT-pack (последняя некомерсиальная версия - 2.3.0).

Да, и еще - почему не так:

Код:
STRING_ABOUT : WideString = 'О программе...';
...
AppendMenuW(hSysMenu, MF_BYPOSITION, CONTEXT_ABOUT, PWideChar(STRING_ABOUT));

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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