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

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

Автор: greenpc
Дата сообщения: 30.05.2008 11:55
AndreyAgrh
смотри в сторону "Разработка MDI приложений"
Автор: AndreyAgrh
Дата сообщения: 30.05.2008 12:05
greenpc
нее, у меня не MDI приложение. С MDI окнами видел пример в Королевстве, но не смог из него ничего смастерить подходящее.
Автор: Ramazan
Дата сообщения: 30.05.2008 13:05
AndreyAgrh
Типа, так:

Код:
procedure WMGETMINMAXINFO (var Msg:TWMGETMINMAXINFO); message WM_GETMINMAXINFO;

procedure TForm1.WMGetMinMaxInfo(var Msg:TWMGetMinMaxInfo);
begin
with Msg.MinMaxInfo^ do
begin
ptMinTrackSize.x:=308; { минимальная ширина окна }
ptMinTrackSize.y:=180; { минимальная высота окна }
ptMaxTrackSize.x:=400; { максимальная ширина окна }
ptMaxTrackSize.y:=250; { максимальная высота окна }
ptMaxPosition.x:=BoundsRect.Left; { максимальная позиция окна по оси Х после максимизации }
ptMaxPosition.y:=BoundsRect.top; { максимальная позиция окна по оси У после максимизации }
ptMaxSize.x:=308; { максимальная ширина окна после максимизации }
ptMaxSize.y:=180; { максимальная высота окна после максимизации }
end;
inherited;
end;
Автор: Maks150988
Дата сообщения: 30.05.2008 20:04
Никогда не любил работать со строками, но во вот проблема...
Допустим есть строка типа:

путькфайлу,данные
путькфайлу, данные
путькфайлу /данные

Необходимо чтобы конечный результат, вытянутый из этой строки был "путькфайлу".
Подмогните плиз кто-нибудь с реализацией.
Автор: Frodo_Torbins
Дата сообщения: 30.05.2008 21:27
В простейшем случае подойдёт функция pos.
Автор: ymg2000
Дата сообщения: 30.05.2008 21:43
Maks150988
Несколько строковых функций, которые могут пригодиться как в твоем случае, так и в других:
[more]
function StrChPos(const S: string; C : Char; var Pos : Cardinal) : Boolean;
{ Возвращает позицию C в строке S }
asm
push ebx { Save registers }
push edi

or eax, eax { Protect against null string }
jz @@NotFound

xor edi, edi { Zero counter }
mov ebx, [eax-StrOffset].LStrRec.Length { Get input length }

@@Loop:
inc edi { Increment counter }
cmp [eax], dl { Did we find it? }
jz @@Found
inc eax { Increment pointer }

cmp edi, ebx { End of string? }
jnz @@Loop { If not, loop }

@@NotFound:
xor eax, eax { Not found, zero EAX for False }
mov [ecx], eax
jmp @@Done

@@Found:
mov [ecx], edi { Set Pos }
mov eax, 1 { Set EAX to True }

@@Done:
pop edi { Restore registers }
pop ebx
end;

function CharExistsInStr(const S : string; C : Char) : Boolean; register;
{ Возвращает True, если символ C содержится в S }
asm
push ebx
xor ecx, ecx
or eax, eax
jz @@Done
mov ebx, [eax-StrOffset].LStrRec.Length
or ebx, ebx
jz @@Done
jmp @@5

@@Loop:
cmp dl, [eax+3]
jne @@1
inc ecx
jmp @@Done

@@1:
cmp dl, [eax+2]
jne @@2
inc ecx
jmp @@Done

@@2:
cmp dl, [eax+1]
jne @@3
inc ecx
jmp @@Done

@@3:
cmp dl, [eax+0]
jne @@4
inc ecx
jmp @@Done

@@4:
add eax, 4
sub ebx, 4

@@5:
cmp ebx, 4
jge @@Loop

cmp ebx, 3
je @@1

cmp ebx, 2
je @@2

cmp ebx, 1
je @@3

@@Done:
mov eax, ecx
pop ebx
end;

function WordPosInStr(N: Cardinal; const S, WordDelims: string; var Pos: Cardinal) : Boolean;
{ Устанавливается строка-разделитель слов и номер N искомого слова в строке. }
{ Если слово с таким номером есть в строке S, возвращается True и позиция начала этого слова }
var
Count: Cardinal;
K : Cardinal;
begin
Count := 0;
K := 1;
Result := False;

while (K <= Length(S)) and (Count <> N) do begin
{skip over delimiters}
while (I <= Length(S)) and CharExistsInStr(WordDelims, S[K]) do
Inc(I);

{if we're not beyond end of S, we're at the start of a word}
if K <= Length(S) then
Inc(Count);

{if not finished, find the end of the current word}
if Count <> N then
while (K <= Length(S)) and not CharExistsInStr(WordDelims, S[K]) do
Inc(K)
else begin
Pos := K;
Result := True;
end;
end;
end;

function ExtractWordFromStr(N: Cardinal; const S, WordDelims: string): string;
{ Возвращает N-ое слово строки S. Слова отделены разделителем WordDelims. }
var
K, J : Cardinal;
begin
Result := '';
if WordPosInStr(N, S, WordDelims, K) then begin
{find the end of the current word}
J := K;
while (K <= Length(S)) and not CharExistsInStr(WordDelims, S[K]) do
Inc(K);
SetLength(Result, K-J);
Move(S[J], Result[1], K-J);
end;
end;

function GetPreffix(const VildPattern: string; const VildCh: char): string;
{ Возвращает подстроку от начала строки VildPattern до первого вхождения }
{ в строку символа VildCh }
var
APos: cardinal;
begin
IF Not StrChPos(VildPattern, VildCh, APos) or (APos < 2) THEN
Result := ''
ELSE
Result := ExtractWordFromStr(1, VildPattern, VildCh);
end;
[/more]
Автор: Maks150988
Дата сообщения: 30.05.2008 22:07
Ребят, просто назрела необходимость вытаскивания значков из исполняемых файлов. Хочется сделать что-то вроде редактора списка запускаемых приложений во время загрузки системы. Сначала подумывал о StringReplace, но эта идея быстро отпала - всего и не предугадаешь что могут писать программы в автозапуск. Например есть строки (перед большим пробелом не считается):

DSLSTATEXE C:\Program Files\D-Link\DSL-200\dslstat.exe icon
DSLAGENTEXE C:\Program Files\D-Link\DSL-200\dslagent.exe
NvCplDaemon RUNDLL32.EXE C:\WINDOWS\system32\NvCpl.dll,NvStartup
nwiz nwiz.exe /install
NvMediaCenter RUNDLL32.EXE C:\WINDOWS\system32\NvMcTray.dll,NvTaskbarInit

Необходимо как-то парсить эту строку чтобы извлечь путь к файлу. Потом подумывал что может стоит попробовать через GetModulePath получать путь к файлу - вроде как в автозапуске есть и значит типа модуль загружен в память и можно к нему добраться, но а вдруг безопасный режим...
Вот интересует меня как всякие чистилки/деинсталляторы, имеющие возможность просмотра автозагрузки, извлекают значки файлов. Или функция SHGetFileInfo имеет какие-то параметры для вытягивания значков при неполном пути?
Автор: Erazer
Дата сообщения: 31.05.2008 15:49
подскажите плз как можно привязать компоненты к панели, чтобы при изменении места/положения/размера панели они оставались на ней ?
Автор: Frodo_Torbins
Дата сообщения: 31.05.2008 17:27
Erazer
Положить их на эту панель? Подробнее пожалуйста.
Автор: TohaDub
Дата сообщения: 31.05.2008 20:27
Что то не могу врубится, при условии что :

var z: Dooble;
CbGEdit.Text:='0.25';
Z:=StrToFloat(CbGEdit.Text);

в итоге Z получается равной 0.2499123912943312. Почему так?
Мне нужно что бы и было 0.25
Как сделать, подскажите плиз.
Автор: mvictor71
Дата сообщения: 31.05.2008 21:03

Цитата:
var z: Dooble;
CbGEdit.Text:='0.25';
Z:=StrToFloat(CbGEdit.Text);

в итоге Z получается равной 0.2499123912943312. Почему так?
Мне нужно что бы и было 0.25
Как сделать, подскажите плиз.

это обычное явление для чисел с плав. запятой. Используй другой тип или при чтении из переменной делай округление
Автор: ymg2000
Дата сообщения: 31.05.2008 21:05
TohaDub
function RoundFloat(const R: Extended; const Decimals: integer): Extended;
{ Округление реальных чисел с Decimal десятичных знаков }
var
Factor: Extended;
begin
Factor := Int(Exp(Decimals * Ln(10)));
Result := Round(Factor * R)/Factor;
end;
Автор: TohaDub
Дата сообщения: 31.05.2008 21:39
mvictor71, ymg2000. Спасибо.
Автор: Erazer
Дата сообщения: 31.05.2008 22:13
Frodo_Torbins
положил, но при изменении размеров панели combobox остается таких же размеров как был.. а надо чтобы увеличивася /уменьшался вместе с панелью
Автор: ymg2000
Дата сообщения: 31.05.2008 22:40
Erazer
Свойство Anchors
Автор: Erazer
Дата сообщения: 31.05.2008 23:27
ymg2000
пасип! теперь другая проблема - как сделать чтобы панели не уменьшались при перетаскивании splitter менее допустимого размера ?
Автор: Maks150988
Дата сообщения: 01.06.2008 01:41
Парни да ну чо никто прям не знает штоли... Ну хотя бы если есть за что уцепица, направьте на путь истинный. =) Очень нужна реализация этой фичи.
Автор: ymg2000
Дата сообщения: 01.06.2008 09:02
Erazer
Свойство Constraints панели.
Автор: Erazer
Дата сообщения: 01.06.2008 12:37
И снова БОЛЬШОЕ СПАСИБО, и снова возможно тупой вопрос но... как сделать так чтобы контекстное меню появлялось над конкретным компонентом, а не где-то за его пределами ?

Добавлено:
нашел - PopupMenu
Автор: Frodo_Torbins
Дата сообщения: 01.06.2008 13:28
Maks150988
Наверно легче всего будет парсить строку самостоятельно, благо там не так много вариантов. Сначала выделяете все, что стоит от начала строки и до первого ".exe". Если это не "RUNDLL32", то берете иконку из этого файла. В противном случае ищете дальше ".dll" и пытаетесь взять иконку из нее. Могут быть случаи, когда иконки в экзешнике нету, тогда надо показать стандартную LoadIcon(0, IDI_APPLICATION). Еще желательно приводить строки перед разбором к нижнему регистру, и учитывать, что пути могут быть заключены в знаки двойных кавычек.
Автор: Maks150988
Дата сообщения: 01.06.2008 15:29
Frodo_Torbins
А как быть с nwiz.exe? Сначала я подумывал о том что раз все равно в автозагрузке, значит считаем что процесс загружен и открываем через OpenProcess с последующим получнеием пути к файлу. А если не загружен, то как...
Автор: Erazer
Дата сообщения: 01.06.2008 16:58
Раньше пользовался для форматирования кода DelForEx, на 2007 оно не работает к сожалению, попробовал JEDI Code Format V2.0 - такой тормоз... по нес минут на двухядерке форматирует что то там себе... помогите найти альтернативу...

Добавлено:
УРРААААААААААА! сбылась места идиота http://www.cnblogs.com/Files/Icebird/DelForExD2007.rar
Автор: Erazer
Дата сообщения: 01.06.2008 19:22
где-то я уже сталкивался но не помню как решалось ... в VirtualStringTree при перетаскивании сплиттера колонки она расширяется в противоположную сторону за счет соседней. т.е. тащу вправо а она расширяется влево а если пытаюсь тащить левый влево то он не двигается
Автор: Antananarivu
Дата сообщения: 01.06.2008 20:08
Здравствуйте. Вопрос такой. тандартный объект Ttimer. Когда он запущен могу ли я узнать сколько времени осталось до его срабатывания? Скажем я установил Interval в 500000 миллисекунд и запустил таймер, а через некоторое время мне необходио узнать, когда таймер сработает, как я могу получить это значение? Заранее спасибо!
Автор: RomanTim
Дата сообщения: 01.06.2008 21:47
Antananarivu
Средствами самого TTimer вряд-ли... Вычисли перед запуском время срабатывания, а когда понадобится - определи сколько до него еще осталось
Автор: Antananarivu
Дата сообщения: 01.06.2008 23:00
RomanTim
Спасибо, я так и сделал. Просто было интересно возможно ли в принципе то, о чем я спрашивал. Значит все-таки невозможно.
Автор: Frodo_Torbins
Дата сообщения: 01.06.2008 23:20
Maks150988
По идее если путь не указан, значит система должна сама его найти. Попробуйте просто передавать название этого экзешника в функцию получения иконок. Хотя может какая из системных функций по работе с путями может дать полный путь к нему. В любом случае именно для таких ситуаций и придуманы дефолтные иконки.
Автор: Dimoniusis
Дата сообщения: 02.06.2008 20:23
Antananarivu нельзя. Обычно если надо что-то проверять во время работы - то сам таймер ставят с меньшим интервалом и в нем же считают в какой-нибудь переменной, сколько времени реально прошло.
Автор: OdesitVadim
Дата сообщения: 03.06.2008 02:29
Считать в переменной - очень большая ошибка. Дело в том, что события от таймера могу пропускаться.
Именно по этому, на больших интервалах времени при маленьком значении interval и загруженной системе такой счётчик времени начинает отставать.
Лучше запоминать время старта и по таймеру считать разницу. Поможет в этом функция GetTickCount - она считает тысячные доли секнуд от старта системы.
Автор: Dimoniusis
Дата сообщения: 03.06.2008 12:14
OdesitVadim зависит от точности и прочего. Где-то запоминаем геттик каунт, (кстати относительно старта можно считать и переменную - и пропуски тоже будут не страшны), где-то можно просто уменьшать обычную - где точность совершенно не критична и нужно просто вызывать какой то фоновый процесс/проверку

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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