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

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

Автор: dmit000
Дата сообщения: 24.02.2009 10:26
Всем привет!
Установил компаненты Raize Components. Побаловался. Затем решил их убрать с формы, заменив стандартными компанентами. Убрал.
Вопрос:
Как (только не руками) убрать описание того чего уже нет на форме из раздела USES?
Автор: f3ka
Дата сообщения: 24.02.2009 12:30
dmit000 использовать наверно придется какой нить эксперт... либо самому написать либо найти...
Автор: Mandor Sawall
Дата сообщения: 24.02.2009 14:31
dmit000
Попробуй ето: http://www.peganza.com/products_icarus.htm
Автор: StalkerSoftware
Дата сообщения: 24.02.2009 16:07
Frodo_Torbins

Цитата:
StalkerSoftware
Цитата:
Этого я сделать не могу, так как Key это var параметр обработчика нажатия клавиши OnKeyPress.

Ну и? Обьявите новую переменную AnsiChar, присвойте ей значение key...

Пробовал, но что то я видать не так делаю.

cKey :AnsiChar;

cKey := Key
или
cKey := AnsiChar(Key)

В первом случае D2009 просто ругается на несовместимость типов, во втором случае хотя и запускается, но идет неправильное преобразование типов.

Вопрос: Как правильно преобразовать из Char в AnsiChar ?


Автор: Dmiro
Дата сообщения: 25.02.2009 13:55
StalkerSoftware
Изврат, конечно, но так работает.

Var
ch:AnsiChar;
s:AnsiString;
begin
s:=Key;
ch := s[1];
if CharInSet( ch, ['а'..'я', 'А'..'Я']) then
Автор: dmit000
Дата сообщения: 25.02.2009 14:35
f3ka
Mandor Sawall
Спасибо!
Автор: Frodo_Torbins
Дата сообщения: 25.02.2009 18:20
StalkerSoftware
Вариант от Dmiro действительно будет работать. Но раз уж решили переходить на юникод, то и методы надо использовать соответствующие. Согасно карте юникода кирилические символы можно определить так:
Код: if (Ord(Key) >= $400) and (Ord(Key) <= $4FF) then
Автор: StalkerSoftware
Дата сообщения: 25.02.2009 19:21
Dmiro
Frodo_Torbins

А что в D2009 нет функции для конвертирования строк (String, Char) из unicode В нужный CodePage и обратно ?
Автор: Dmiro
Дата сообщения: 26.02.2009 11:28
StalkerSoftware

Вот нашел в JEDI Code Library

function WideStringToStringEx(const WS: WideString; CodePage: Word): AnsiString;
var
InputLength,
OutputLength: Integer;
begin
InputLength := Length(WS);
OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil);
SetLength(Result, OutputLength);
WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
end;
Автор: Mandor Sawall
Дата сообщения: 26.02.2009 11:44
Frodo_Torbins
Я еще не работал с D2009, но разве константные строки (и символы) не Unicode?
Т.е. вот ето:
Код: if (Key >= 'А') and (Key <= 'я') then
Автор: OOD
Дата сообщения: 26.02.2009 13:22
спецы подскажите пожалуйста как сделать вылет формы по центру экрана ?
Автор: Frodo_Torbins
Дата сообщения: 26.02.2009 13:22
StalkerSoftware
Есть, она называется SetCodePage.
Mandor Sawall
Работает, но оставляет за бортом такие буквы как "ЁёІіЇїЄєҐґ".

Добавлено:
OOD
Поставьте ей Position=poDesktopCenter.
Автор: f3ka
Дата сообщения: 26.02.2009 13:35
OOD

Цитата:
Поставьте ей Position=poDesktopCenter.

или poScreenCenter
Автор: OOD
Дата сообщения: 26.02.2009 13:38
Frodo_Torbins
f3ka
Спасибо
Автор: dimonadv
Дата сообщения: 27.02.2009 20:28
Может кто подскажет как можно перенести (в 2009) сохраненные настройки раскладки десктопа на другую машину. Вернее где они хранятся ?
Суть проблемы в том что на одной машине QA Audits отрабатывает, а окно с результатами не появляется (на другой машине тот же проект - все ок).
Если запускать QA Metrics, то окно Metrics появляется без проблем. Может оно по каким то причинам находится вне видимости экрана ? На 2006 пару раз такое бывало, сносил DSK и помогало, а тут немогу понять где она все хранит.
Автор: Frodo_Torbins
Дата сообщения: 27.02.2009 20:38
dimonadv
У меня C:\Users\*\AppData\Roaming\CodeGear\BDS\6.0, а вообще можете выполнить поиск файлов *.dst.
Автор: Bonivur
Дата сообщения: 27.02.2009 21:21
Никак не могу найти хороший алгоритм. Задача (в обобщенно-отвлеченном изложении) выглядит так:
Требуется найти все слова в заданном тексте, нечинающиеся с заглавной буквы и вывести их (допустим) в TList. Причем, в тексте могут быть слова, у которых заглавная буква где-то посередине (такие слова в список не включать).
Автор: ShIvADeSt
Дата сообщения: 28.02.2009 05:34
Bonivur
Задача простая, делаешь набор А символов разделитей (пробел, точка, запятая и тп). И набор Б символов, которые могут стоять перед словом (пробел, кавычки и тп). Далее перебираешь символы по одному, если нашел символ из набора Б, то смотришь след символ болшая буква или нет, если да то начиная с этой позиции сканируешь на наличие символа из набора А. Как нашел- то что внутри нужное слово, дальше ищешь с последней позиции.
Автор: Maks150988
Дата сообщения: 28.02.2009 13:37
Привет. Кто-нибудь может помочь с такой ситуацией?

Нужно отображать панель меню в ребаре - наподобие проводника/интернет эксплорера/системных программ.
Сделал так: загрузил ресурс диалога И добавил это окошко в банд ребара.
Как через SetParent или через что это делается сделать полностью загруженное окно CHILD?


Код: {}
procedure CreateMenuRebarToolbar(hWnd: Thandle);
var
hMenuRebar: Thandle;
TRebarRect: TRect;
TRebarInfo: TRebarBandInfoW;
hChildWind: Thandle;
cxIdeal : Integer;
cxIndex : Integer;
szBtnText : WideString;
begin
hMenuRebar := CreateWindowExW(WS_EX_TOOLWINDOW, REBARCLASSNAME, nil, WS_VISIBLE or WS_BORDER or WS_CHILD or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or RBS_VARHEIGHT or RBS_BANDBORDERS or CCS_NODIVIDER, 0, 0, 0, 0, hWnd, ID_MENUEX_SYSREBAR, hInstance, nil);

if (hMenuRebar <> 0) then
begin
hChildWind := CreateDialogW(hInstance, MAKEINTRESOURCEW(RC_DIALOG_MENUEX), 0, nil);
if (hChildWind <> 0) then
begin
SetMenu(hChildWind, RebarMenu);
GetWindowRect(hChildWind, TRebarRect);
ZeroMemory(@TRebarInfo, SizeOf(TRebarInfo));
TRebarInfo.cbSize := SizeOf(TRebarBandInfoW);
TRebarInfo.fMask := RBBIM_SIZE or RBBIM_CHILD or RBBIM_CHILDSIZE or RBBIM_STYLE;
TRebarInfo.cxMinChild := TRebarRect.Right - TRebarRect.Left;
TRebarInfo.cyMinChild := TRebarRect.Bottom - TRebarRect.Top + 2;
TRebarInfo.cx := 100;
TRebarInfo.fStyle := RBBS_CHILDEDGE or RBBS_NOGRIPPER or RBBS_GRIPPERALWAYS;
TRebarInfo.wID := ID_SYSREBAR_MENUEX;
TRebarInfo.hwndChild := hChildWind;
SendMessage(hMenuRebar, RB_INSERTBAND, WPARAM(-1), LPARAM(@TRebarInfo));
end;
hChildWind := CreateWindowExW(WS_EX_TOOLWINDOW, TOOLBARCLASSNAME, nil, WS_VISIBLE or WS_CHILD or CCS_NODIVIDER or CCS_NORESIZE or CCS_NOPARENTALIGN or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS, 0, 0, 0, 0, hMenuRebar, ID_SYSREBAR_TOOLB, hInstance, nil);
if (hChildWind <> 0) then
begin
GetWindowRect(hChildWind, TRebarRect);
SendMessageW(hChildWind, TB_BUTTONSTRUCTSIZE, SizeOf(TTBBUTTON), 0);
SendMessageW(hChildWind, TB_BUTTONCOUNT, 0, 0);
SendMessageW(hChildWind, TB_ADDBUTTONS, Length(tbButtons), LPARAM(@tbButtons));
SendMessageW(hChildWind, TB_AUTOSIZE, 0, 0);
tbBitmap.hInst := 0;
tbBitmap.nID := ImageBmp;
SendMessageW(hChildWind, TB_ADDBITMAP, Length(tbButtons), LPARAM(@tbBitmap));
szBtnText := 'Открыть файл'#0'Извлечь в...'#0'Поиск файлов'#0'Информация'#0'О программе'#0#0;
//SendMessageW(hChildWind, TB_ADDSTRINGW, 0, LPARAM(szBtnText));
SendMessageW(hChildWind, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS or TBSTYLE_EX_MIXEDBUTTONS);
cxIdeal := 0;
for cxIndex := 0 to SendMessageW(hChildWind, TB_BUTTONCOUNT, 0, 0) - 1 do
begin
SendMessageW(hChildWind, TB_GETITEMRECT, WPARAM(cxIndex), LPARAM(@TRebarRect));
Inc(cxIdeal, (TRebarRect.Right - TRebarRect.Left));
end;
ZeroMemory(@TRebarInfo, SizeOf(TRebarInfo));
TRebarInfo.cbSize := SizeOf(TRebarBandInfoW);
TRebarInfo.fMask := RBBIM_SIZE or RBBIM_CHILD or RBBIM_CHILDSIZE or RBBIM_STYLE;
TRebarInfo.cxMinChild := TRebarRect.Right - TRebarRect.Left;
TRebarInfo.cyMinChild := TRebarRect.Bottom - TRebarRect.Top + 2;
TRebarInfo.cx := 100;
TRebarInfo.cxIdeal := cxIdeal;
TRebarInfo.fStyle := RBBS_CHILDEDGE or RBBS_NOGRIPPER or RBBS_GRIPPERALWAYS or RBBS_BREAK;
TRebarInfo.wID := ID_SYSREBAR_TOOLB;
TRebarInfo.hwndChild := hChildWind;
SendMessageW(hMenuRebar, RB_INSERTBAND, WPARAM(-1), LPARAM(@TRebarInfo));
end;
end;
end;
Автор: ShIvADeSt
Дата сообщения: 01.03.2009 03:32

Цитата:
И еще вопрос. Почему программа начинает потреблять много ЦП с таким кодом?

Потому что ты пытаешь в событии WM_PAINT окна перерисовывать контрол. Если надо - то рисуй в его собственном событии по отрисовке (думаю надо ему Owner_Draw делать).

Насчет ребара, посмотри тут, попробуй заюзать этот код http://it.inhe.net/richbbs/2006/334/3346780.htm
Автор: DmitryKz
Дата сообщения: 01.03.2009 12:59
Ребята, объясните, плиз:
надо сделать три юникодных константы, делаю так:

Код: PathAppDataFirm:WideString='\Firm Name';
PathAppDataProg:WideString='\Prog Name';
PathAppData: WideString=PathAppDataFirm+PathAppDataProg+'\';
Автор: tatuich
Дата сообщения: 01.03.2009 13:08
Delphi 2007. Выдается ошибка.


Код: var
a: 0..3;
begin
a := ini.ReadInteger('SampleSection', 'SampleValue', 0);
// допустим в ini-файле указано значение 5
RadioGroup.ItemIndex := a;
end;
Автор: V1s1ter
Дата сообщения: 01.03.2009 13:38
DmitryKz

Не смотря, что конструкция
ИмяКонстанты: Тип = Значение
считается константой она на самом деле переменная
с соответствующими последствиями.

Добавлено:
DmitryKz

Не смотря, что конструкция
ИмяКонстанты: Тип = Значение
считается константой она на самом деле переменная
с соответствующими последствиями.

Добавлено:
tatuich
Ну вопервых для переменной "a" все равно сколько пунктов RadioGroup.
Во вторых под переменую "a" в казаной конструкции выделено памяти как под переменную типа Integer с соответствующим диапазоном возможных значений.
Однако поскольку задано

Цитата:
var
a: 0..3;

То компилятор везде где может (имено где может, а в выше указаном месте не может) будет ругатся, если "а" будет присвоено значение в не указанного диапазона.
При этом допустимо для преременой "а" присваивать все значения из диапазона Integer.
Автор: asdnsd
Дата сообщения: 01.03.2009 22:35
Ребят кто знает, возможно ли средствами Delphi (есть ли компоненты) создавать backup к базе данных MS SQL Server? ой немного не в ту тему.
Автор: tatuich
Дата сообщения: 02.03.2009 17:16

Цитата:
Ну вопервых для переменной "a" все равно сколько пунктов RadioGroup

Ну это я знаю, поэтому и вылазит ошибка.


Цитата:
Во вторых под переменую "a" в казаной конструкции выделено памяти как под переменную типа Integer

То есть ограничить переменную диапазоном 0..3 в данной ситуации никак не получится?
Автор: Frodo_Torbins
Дата сообщения: 02.03.2009 19:34
tatuich
Range checking в опциях проекта попробуйте включить.
Автор: delover
Дата сообщения: 03.03.2009 08:31
Ребята. Как скроллировать картинку? У меня Image1.AutoSize=True и лежит она на ScrollBox1. Курсор я задал crHandPoint. При нажатии и перетаскивании я делаю:

Код: procedure TForm1.Image1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
FDragPoint := Point(X, Y);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssLeft in Shift then
begin
ScrollBox1.ScrollBy(X-FDragPoint.X, Y-FDragPoint.Y);
FDragPoint := Point(X, Y);
end;
end;
Автор: delover
Дата сообщения: 03.03.2009 11:51
Как Вы видите FDragPoint я сохраняю текущий всегда. И вот если я довёл до конца и держу мышку в одном месте, у меня картинка прыгает туда-сюда, будьто бы координаты мышки менялись, а я держу её в одном месте. Это что - глюк виндовс или VCL по разному координаты считает?
Автор: V1s1ter
Дата сообщения: 03.03.2009 11:58
tatuich

Цитата:
То есть ограничить переменную диапазоном 0..3 в данной ситуации никак не получится?

1) Если вписать пару строк кода проверки типа if...then, то получится, но думаю Вы этот способ и без меня хорошо знаете.

2) Если воспользоватся предложением Frodo_Torbins

Цитата:
Range checking в опциях проекта попробуйте включить.

То без п.1. приложение будет "вылетать" с ошибкой.

3) На самом деле подумайте, а не воюете ли Вы с "мельницами". Насколько я понимаю ini-файл содержит состояние програмного обеспечения, слеловательно должен создаватся автоматически. Таким образом данный файл должен содержать только коректные значения. Я понимаю есть желание создать надежный код, но прежде чем его создавать определитесь насколько надежным он должен быть. Поскольку запросто можно ути в дебри.
Автор: tatuich
Дата сообщения: 03.03.2009 15:22

Цитата:
Таким образом данный файл должен содержать только коректные значения.

Просто пишется в файл корректное значение. Но вдруг кому-нибудь взбредет в голову отредактировать ini-файл вручную, и в итоге программка вылетит. Похоже придется везде применять if...then.

Не знаю, может это специфика Delphi 2007, но какие-то непонятки с TRegistry у меня возникли. На Delphi 7 такой мороки вроде не было.
Допустим, если сначала использовать reg.OpenKeyReadOnly, а потом дальше по коду reg.OpenKey и reg.WriteString, то будет выдаваться ошибка записи данных в реестр. Только потом до меня доперло, что нужно перед такими участками кода делать reg.Access:=KEY_ALL_ACCESS и reg.Access:=KEY_READ. Тогда все будет без ошибок.

Еще кстати понравилось интересное поведение. Если не сделать reg.CloseKey, и вызвать reg.OpenKey, то открывается подключ. Пример:
Код: reg.OpenKey('*\shell\MyApp',True);
reg.WriteString('','Open with MyApp');
reg.OpenKey('command',True);

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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