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

» Вопросы по Delphi 2

Автор: DroN_S
Дата сообщения: 09.10.2006 09:54

Цитата:
вроде как нужно проверить валидность имени файла нового не обязяательно существующего

тогда делать сканирование директории где находятся файлы и проверять наименования..
Автор: RedPromo
Дата сообщения: 09.10.2006 10:20
Jokerjar
Вот такая функция проверяет полное имя файла на валидность. Можно дополнить чтобы поставляла сама расширение default-ное.
[more]
{ Look for invalid chars and simple invalid sequences. }
function isValidFileName( s: string ): Boolean;
var i: Integer;
begin
i := 1;
while ( i <= Length( s ) ) do
begin
if IsDBCSLeadByte( Byte( s[i] ) ) then
Inc( i,2 )
else if s[i] in ['/', '|','<','>','*','?',':','\','"',''''] then
begin
Result := False;
Exit;
end
else
Inc( i );
end;
Result := True;
end;
[/more]
Вот видоизменил в фоответствии с твоими требованиями.
Мне кажется она немного бістрее будет работать чем каждый раз перебирать Pos.
Автор: Jokerjar
Дата сообщения: 09.10.2006 10:49
RedPromo, спасибо. Мне надо проверять имя без пути к нему. Вроде удовлетворился этим:

function Nname(s: string): boolean;
begin
result := (pos('\',s)=0)and(pos('/',s)=0)and(pos(':',s)=0)and
(pos('*',s)=0)and(pos('?',s)=0)and(pos('"',s)=0)and
(pos('<',s)=0)and(pos('>',s)=0)and(pos('|',s)=0);
end;
Автор: RedPromo
Дата сообщения: 09.10.2006 11:07
Может кто подсказать у меня с какогото момента в проекте BDS2006 начинает при авто созданиии функции например ButtonDown после begin лепить inherited самое главное там где это совсем не в тему и в тему.
Автор: OdesitVadim
Дата сообщения: 09.10.2006 11:13
Если есть override - тогда так и должно быть. Но может какой-то эксперт балуется
Автор: RedPromo
Дата сообщения: 09.10.2006 11:32
OdesitVadim
Нет override нет он ставит inherited даже на нажатие кнопки. Мне кажется єто потому как у меня переопределен родитель формы TForms. Вот он и балуется.
Автор: Saxonika
Дата сообщения: 09.10.2006 23:57
Спасибо всем кто откликнулся на мой вопрос.
Всё заработало.

Особое спасибо RostY

Почему-то мне казалось что рекомендации по поводу WaitForSingleObject не могут вызывать сомнений. Оказалось, что именно в нём и вся загвоздка!!!

Как только я вызов WaitForSingleObject поменял на циклирование - всё стало как шёлкоевое. Я так и не понял почему. Вероятно WaitForSingleObject что-то такое ещё специфическое делает. Но что? Именно из-за него дочерний процесс чувствует родительский...

Правда при вызове WaitForSingleObject программа как бы замораживалась и пока не вернётся управление просто простаивала (проц не грузила), а теперь оно циклится и грузит проц

Как бы от этого избавиться ?
Автор: RomanTim
Дата сообщения: 10.10.2006 07:11
Saxonika

Цитата:
Правда при вызове WaitForSingleObject программа как бы замораживалась и пока не вернётся управление просто простаивала (проц не грузила), а теперь оно циклится и грузит проц
Как бы от этого избавиться ?

Делай проверку не в цикле а по таймеру - период можешь подобрать под себя в зависимости от среднего времени выполнения проги
Автор: Jokerjar
Дата сообщения: 10.10.2006 08:30

Цитата:
Делай проверку не в цикле а по таймеру


Если без компонентов пишешь, попробуй типо так :

program testtimer;

uses Windows,Messages;

var
WinClass:TWndClassA;
Handle,Label1,Timer1:Integer;
Msg:TMsg;
t:integer;

procedure timer_do;
var s:string;
begin
inc(t);
str(t,s);
SetWindowText(Label1,Pchar(s));
end;

function WindowProc(hWnd,uMsg,wParam,lParam:Integer):Integer; stdcall;
begin
if uMsg = WM_DESTROY then begin
KillTimer(Handle,Timer1);
halt;
end;
Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

begin
with WinClass do begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := hInstance;
hbrBackground := color_btnface + 1;
lpszClassname := 'test_timer';
hCursor := LoadCursor(0, IDC_ARROW);
end;
RegisterClass(WinClass);
Handle:=CreateWindowEx(WS_EX_WINDOWEDGE, 'test_timer', 'test timer',
WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
363, 278, 305, 65, 0, 0, hInstance, nil);
Label1:=Createwindow('Static', '', WS_VISIBLE or WS_CHILD or SS_CENTER,
8, 12, 76, 13, Handle, 0, hInstance, nil);

Timer1:=SetTimer(Handle,0,1000,@timer_do);
SetWindowText(Label1,'0');

while(GetMessage(Msg,Handle,0,0)) do begin
TranslateMessage(msg);
DispatchMessage(msg);
end;

end.
Автор: RostY
Дата сообщения: 10.10.2006 08:34
Saxonika
по таймеру, наверно, лучше всего будет, но если тебе нужен цикл сделай в цикле что-то типа

while ....
do
sleep(500);
...
...
Application.ProcessMessages;
end; //while
Автор: vserd
Дата сообщения: 10.10.2006 10:19
Saxonika

Цитата:
Как только я вызов WaitForSingleObject поменял на циклирование

попробуй msgWait* она обрабатывает сообщения.
Автор: Erazer
Дата сообщения: 10.10.2006 14:49
скажите люды добрыя,если есть dll "123.dll" неизвестно чья и кемнаписанная, есть к ней заголовочный 123.pas, можно ль как то заставить ее работать переименованной в 3456.dll ? пробовал переименование и обоих фалов + соответствующую правку 123.pas с заменой "external 123dll" на "external 456dll" но все равно просит 123.dll...
Автор: DroN_S
Дата сообщения: 10.10.2006 15:21

Цитата:
скажите люды добрыя,если есть dll "123.dll" неизвестно чья и кемнаписанная, есть к ней заголовочный 123.pas, можно ль как то заставить ее работать переименованной в 3456.dll ? пробовал переименование и обоих фалов + соответствующую правку 123.pas с заменой "external 123dll" на "external 456dll" но все равно просит 123.dll...

при компиляции чего просит? если в модуле 123.pas то смотри внимательнее модуль, где то она используется или смотри приложение, которое компилируешь... в общем, где то у тебя эта dll'ка используется...
Автор: Jokerjar
Дата сообщения: 10.10.2006 15:45
Erazer, в модуле в самом верху unit 456 написать не забыл?
Автор: Erazer
Дата сообщения: 10.10.2006 15:53
говорит не могу запуститься поскольку 123.dll не найдена... а я ж вроде везде перписал все под 456.dll
Автор: wader
Дата сообщения: 10.10.2006 15:58
Erazer Посмотри внимательнее, скорее всего что-то пропустил.
Сделай поиск по "123". Расширение 'dll', по моему, не обязательно.
Автор: Erazer
Дата сообщения: 10.10.2006 16:17
ниче вроде не пропустил.... сначала просит dll а потом project ... faulted with message 'privilaged' instruction in 0x.........
Автор: OdesitVadim
Дата сообщения: 10.10.2006 16:37
А если рядом положить 123.dll, то работает нормально?
Если да, то проверь, не осталось ли у тебя файла 123.dcu и основной проект гдето в uses не использует его. Удали dcu и сделай билд проекта. У меня такое бывало - удаляеш файл с проекта (pas), а он спокойно dcu берёт
Автор: Jokerjar
Дата сообщения: 10.10.2006 17:03
Или показывай свой модуль. Вместе поищим
Автор: OrlangurStep
Дата сообщения: 10.10.2006 18:04
Подскажите, как мне лучше оформить работу с базой данных.
Конкретно, есть база данных M$ Access с одной таблицей. Необходимо: при отображении таблици пользователь должен выбирать место строк ( с помощью кнопок Переместить Вверх, Переместить вниз, как это сделано например в ReGet`e). У самого есть варианты:
1. Тупо поменять местами значения ячеек в соседних строках. ( в таблице столбцов немного, сделать это не сложно)
2. Ввести еще одно поле, сортировать таблицу по нему, а при нажатии указанных кнопок менять местами значения в этом поле.
Автор: EZH
Дата сообщения: 10.10.2006 21:00
OrlangurStep
Правильным будет второй вариант. Никогда нельзя полагаться на порядок записей в таблице (даже по теории - это просто множество неупорядоченных объектов).
Автор: OrlangurStep
Дата сообщения: 10.10.2006 21:15
EZH

Цитата:
Правильным будет второй вариант.

Я так и начал. Спасибо за совет.
Автор: SERGE_BLIZNUK
Дата сообщения: 10.10.2006 21:24
OrlangurStep
Полностью согласен с EZH - ТОЛЬКО второй вариант.
Он 1) быстрее 2) проще и 3)самое главное - он единстенно рабочий, для любого варианта БД (в нормальной (SQL) СУБД нет понятия 'физический порядок записей'!!)

Автор: svs123456789
Дата сообщения: 10.10.2006 21:40
SDI Application, Delphi 7,
на главной форме (SDIAppForm) лежит ActionManager1 и ActionToolBar1,
из главной формы (создаются и) вызываюся другие (вспомогательные) формы (Form2),
на них лежат ActionToolBar2, ActionToolBar3 и т.д. соответсвенно, (Form2 uses SDIMAIN);
и соответсвенно:
Form2.ActionToolBar2.ActionManager:=SDIAppForm.ActionManager1

как визуально (при разработке формы) добавлять на ActionToolBar2 и какие-либо Action из ActionManager1 ?

или лучше ActionManager положить на родительскую форму а остальные формы наследовать
Автор: OrlangurStep
Дата сообщения: 10.10.2006 22:08
SERGE_BLIZNUK
В базе данных также есть ключевое поле - счетчик так, что его можно использовать для формирования "физического порядка данных", но все равно лучше 2 вар.
Автор: andead
Дата сообщения: 11.10.2006 00:50
как передать потоку при создании некоторые значения?
Автор: Jokerjar
Дата сообщения: 11.10.2006 01:00
Существует ли что-то вроде DRKB для Делфи, только для С++?

andead, через глобальные переменные

Автор: andead
Дата сообщения: 11.10.2006 02:10
глобальные переменные не подходят по некоторым обстоятельствам
Автор: Jokerjar
Дата сообщения: 11.10.2006 04:33
andead, как так? Ты как поток делаешь? Классом? Я обычно просто процедурой CreateThread
Автор: RomanTim
Дата сообщения: 11.10.2006 06:58
andead
Если используешь TThread, то можно сделать тремя способами:
1. Переписать конструктор класса-потока, в который добавить свой передаваемый параметр
2. Создавать поток с CreateSuspended = True, потом писать ему в public-переменную и делать Resume
3. Все таки через глобальную переменную, которая используется только для передачи потокам параметра, и они ее читают в своем конструкторе - так ка конструкторы потоков выполняются в контексте основного, то конфликтов не будет

На мой взгляд лучше делать первым способом - и параметр передать не забудешь, и программа читабельней - сразу видно, что твоему потоку нужен этот параметр

Jokerjar

Цитата:
Я обычно просто процедурой CreateThread

Использование делфи для того, чтобы писать на голом АПИ - это все-таки на любителя

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


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