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

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

Автор: Frodo_Torbins
Дата сообщения: 17.02.2008 23:17
Application.Terminate это: уважаемая VCL не будете ли вы так любезны корректно отправить приложение на покой?
А Halt это просто дубиной по голове и все. Помоему даже finalization секции не выполняются, сразу выгрузка из памяти.
Автор: xy
Дата сообщения: 17.02.2008 23:24
Frodo_Torbins
т.е. если какой-то ахтунг, то с Terminate можно еще зацепиться за эксепшны и приложение может повиснуть, а Halt гарантированно убивает прогу.. тогда вопрос
если прога в этот момент открывала текстовые файлы, работала с БД - насколько разрушительным может быть применение Halt :-?
Автор: OdesitVadim
Дата сообщения: 18.02.2008 00:25
открытые файлы будут закрыты, но нет гарантии, что забуферизированные данные будут сброшены. По поводу БД - тут двояко. если БД серверная и активно используются транзакции - ничего страшного не будет, транзакция откатиться и всё. Другое дело, если это локальная - тут всё равносильно тем же файлам. Хотя Access например всё разрулит.

Halt просто останавливает в данной точке выполнение программы и всё. ни шагу больше, дальше уже сама операционка заметает следы - вычищая память, закрывая файлы, уничтожая ресурсы. Рекомендуется применять для крайних случаев.
Автор: xy
Дата сообщения: 18.02.2008 00:34
OdesitVadim
О! отлично - то что надо, мне как раз важно было что било прогу сразу, а то бывают некоторые ситуации, когда надо выдать мою ошибку (в красивом окошечке), а потом
я точно знаю что исправить уже нечего нельзя - убить программу побыстрому %)

и в случае с Терминэйтом у меня иногда зависали эксепшны на выходе, иногда зацикливало эти ошибки.. в общем не совсем то что я хотел, видимо, Халт мне поможет

спасибо
Автор: nuker2015
Дата сообщения: 18.02.2008 04:41
Minissota

Цитата:
SQL.Add('SELECT * from PRIEM_OTDEL'); \\ (PRIEM_OTDEL это имя таблицы)
SQL.Add('WHERE');
SQL.Add('(fio_bol = "'+ fam + '")');
SQL.Add('ORDER BY fio_bol');
А ты уверен что такое поле есть?
Ну поставь вконце запроса ";", может поможет, а имя таблицы попробуй в [...] поместить.
ASC и DESC в сортировке необязателен, но может добавить?
На какую строчку ругается?


Добавлено:
xy
Интересно вы ребята с ошибками боретесь Что за ситуация такая, где ошибку исправить нельзя?
Автор: kotel
Дата сообщения: 18.02.2008 07:54

Цитата:
Что за ситуация такая, где ошибку исправить нельзя?

Ну вот у меня нечто похожее было:
Идет обмен через COM порт с каким-то девайсом.
(Вследствие малограмотности для работы с ком портом использую очень удобный компонент TComport из ComPort Library)
Если использовать переходник USB-COM, то его могут неожиданно выдернуть из компа. Вот тут то все и начинается...

PS Если кто работал с FT232R в режиме D2XX - можно ли для него создать событие типа "OnRXBuf" - чтобы не опрашивать постоянно "появились ли данные?"
Автор: xy
Дата сообщения: 18.02.2008 08:19
nuker2015
у меня есть два типа ситуаций - во-первых, когда приложение теряет коннект с БД и восстановить не удаётся - чтобы убить приложение тихо и надежно, ибо там очень много всего оно делае на выходе и по упомянутой выше - малограмотности :) - ситуация аварийного дисконнекта в процедурах выхода (всякие OnClose/OnDestroy) предусмотрена далеко не везде ;)

и во-вторых - в разных местах приложения проводятся разные проверки легальности его использования - если проверка провалилась - надо тихо убить приложение (хотя тут и валидное закрытие в общем-то проканывает почти всегда, но "почти" не всегда устраивает ;), убийство haltом с потерей буферов и т.п. получается даже более суровым для такой ситуации и удобным
здесь правда тупо вызывать Халт не рекомендуется ибо по таким вызовам можно вычислить места проверки, но маскировка - это уже другой вопрос :)
Автор: SergeBS
Дата сообщения: 18.02.2008 08:25
nuker2015

Цитата:
Ну поставь вконце запроса ";", может поможет, а имя таблицы попробуй в [...] поместить.

Не поможет. Ругалось бы на отсутствие поля/таблицы.

Minissota
У тебя условие вывода - ПОЛНОЕ совпадение. Т.е. введешь ИВАН - и получишь только ИВАН. Рой в сторону 'fio_bol LIKE "ИВАН%" '. Тогда будет выводить и ИВАН, и ИВАНОВ и ИВАНИДЗЕ и ИВАНИЩЕНКО, т.е. все, начинающееся на ИВАН. И посмотри еще на регистр букв - это тоже может влиять и лечится соотв. функциями SQL.
Автор: RostY
Дата сообщения: 18.02.2008 08:44
nuker2015
нет у грида проперти Column. Вопрос остается открытым
Автор: Mandor Sawall
Дата сообщения: 18.02.2008 09:08
RostY
Попробуй:

Код: TcxGridDBColumn(ACellViewInfo.Item).DataBinding.FieldName
Автор: RostY
Дата сообщения: 18.02.2008 09:16
Minissota
попробуй вместо
SQL.Add('(fio_bol = "'+ fam + '")');

написать
SQL.Add('(fio_bol = '''+ fam + ''')');

(вместо двойных кавычек и одинарных три одинарные)

Добавлено:
Mandor Sawall
Есть такая буква !!!!! Большое спасибо.
Автор: OXDBA
Дата сообщения: 18.02.2008 11:38
Когда же народ научится параметры использовать?

Код:
SQL.Add('(fio_bol = :fam)');
Params[0].asString := fam;
Автор: RostY
Дата сообщения: 18.02.2008 16:42
OXDBA
три и скобку и еще одну
Автор: ranc
Дата сообщения: 18.02.2008 17:39

Цитата:
(вместо двойных кавычек и одинарных три одинарные)

А я обычно пользуюсь функцией QuotedStr, чтоб c кавычками не морочиться.
Т. е.:
SQL.Add('(fio_bol = '+ QuotedStr(fam) + ')');
Автор: jemiko
Дата сообщения: 19.02.2008 11:55
kirillkr

Цитата:
У кого есть опыт работы такой связки:
Firebird (unicode_fss)
FIB Plus
Delphi 7

нтересует такой вопрос, сколько придеться проходить напильником, чтобы приложение работало в режиме unicode? Какие-то компоненты понадобятся или можно обойтись стандартными? Что для этого надо будет сделать? Что порекомендуете прочитать по этой теме?


Никаких проблем и напильников не понадобится если работать с FIB Plus.
Прочитать можно статьи на самом сайте FIB Plus, правда я работал в среде Д2006, но думаю проблем не должно быть. Еще тебе понадобятся Юникод контролы
"Tnt Unicode Controls" или Юникодовские "LMD".
А для ДБ Грида Посоветую "Berg NextDbGrid" он идет в комплекте "Next Berg Component Site".
Все это добро есть на этом форуме.
удачи.
Автор: lavren
Дата сообщения: 19.02.2008 16:22
Кто нибуть работал с XLSRW II 3.01.02?
Как в компоненте ТXLSReadWriteII2 сменить ширину колонки?
В мануале пишут:

Цитата:

// Set the width of a column in characters
XLS.Sheet[0].Columns[6].CharWidth := 12;
// Set the width of a column in pixels
XLS.Sheet[0].Columns[7].PixelWidth := 30;

Но когда я пишу:

Код: XLSReadWriteII21.Sheets[0].Columns[1].CharWidth:=12;
Автор: deks
Дата сообщения: 19.02.2008 19:36
lavren

Недостаточно кода. Необходим Ваш код, который может приводить к ошибке.

Скорее всего не инициализирован или неправильно создан какой-то объект (возможно типа XLSColumn или его содержащий), потому как происходит нарушение памяти при попытки записи в privat память объекта. Где создается объект типа TXLSColumn?
Автор: kirillkr
Дата сообщения: 19.02.2008 19:56
jemiko

Цитата:
удачи.

Огромное спасибо. У Вас есть опыт? Можно будет обращаться если возникнут вопросы?
Автор: SERGE_BLIZNUK
Дата сообщения: 19.02.2008 21:16
lavren
попробуйте через
procedure SetColWidthChar(Col1, Col2: integer; Value: double)
Sets the width in characters for colmns Col1 to Col2.

например, поставить ширину 20 символов для третьей колонки (нумерация идёт от нуля, если мне память не изменяет):
XLSRW.Sheets[0].Columns.SetColWidthChar(2, 2, 20);

p.s. если надо ширину не в символах, есть ещё SetColWidth(Col1, Col2, Value: integer)

Автор: daMMned
Дата сообщения: 20.02.2008 07:11
Ребят, может кто подскажет. Возникла проблема. Запускаю 3d Mark 06 с помощью CreateProcess


Код:
function Tfrm_Main.TestRunner(const FileName, Params: String; const WinState: Word):boolean;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: String;
begin
CmdLine := '"' + Filename + '" ' + Params;
with StartInfo do
begin
FillChar(StartInfo, SizeOf(StartInfo), #0);
cb := SizeOf(StartInfo);
end;
if FileExists (filename)=false then ShowMessage('Не найден файл '+filename) else
begin
Result := CreateProcess(nil, PChar(String(cmdline)), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(String(ExtractFilePath(Filename))),StartInfo,ProcInfo);
if Result=true then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
end;
Автор: RostY
Дата сообщения: 20.02.2008 08:35
daMMned
а так не пробовал:
[more]
procedure TForm1.Button1Click(Sender: TObject);
Var
s:integer;
prog: array [0..255]of char;
param: array [0..255]of char;
wrkdir: array [0..255]of char;
FProcessHnd: THandle;
FTimer:TTimer;
ExitCode:DWord;
ShellInfo:TShellExecuteInfo;
FHInstance:THandle;

begin
StrPCopy(prog,Edit1.Text);
StrPCopy(param,Edit2.Text);
StrPCopy(wrkdir,Edit4.Text);

FillChar(ShellInfo,SizeOf(TShellExecuteInfo),0);
ShellInfo.cbSize:=SizeOf(TShellExecuteInfo);
ShellInfo.fMask:=SEE_MASK_NOCLOSEPROCESS;
ShellInfo.Wnd:=HWnd_Desktop;
ShellInfo.lpFile:=prog;
ShellInfo.lpParameters:=param;
ShellInfo.lpDirectory:=wrkdir;
ShellInfo.nShow:=SW_SHOWNORMAL;

if ShellExecuteEx(@ShellInfo) then
begin
Edit3.Text:='Working';
FHInstance:=ShellInfo.hInstApp;
FProcessHnd:=ShellInfo.hProcess;
repeat
Application.ProcessMessages;
GetExitCodeProcess(FProcessHnd,ExitCode);
until (ExitCode<>still_Active);

Edit3.Text:='Terminated:'+IntToStr(ExitCode);
end;
end;
[/more]


Добавлено:
еще вариант: засунуть порверку ту что в цикле repeat-until в таймер
Автор: lavren
Дата сообщения: 20.02.2008 08:48
SERGE_BLIZNUK
Заработало! Спасибо!
Автор: daMMned
Дата сообщения: 20.02.2008 09:31
RostY
Нет, так не пробовал.
Помогло, большое спасибо.
Автор: relictus
Дата сообщения: 20.02.2008 10:50
Разбираю один исходник, в нем вместо &#8203;Sleep(100) используется WaitForSingleObject(0, 100) - насколько это корректно и вообще, зачем так сделано, может кто толково объяснить?
Автор: Figaro2000
Дата сообщения: 20.02.2008 11:05
relictus
WaitForSingleObject - прямой вызов Win32 API (см. описание в MS SDK Help), абсолютно корректно.
Смысл вызова - просто ждем 100 без указания объекта (хэндл - 0)
Зачем сделано именно так - сказать сложно, возможно автору исходника привычней работать с объектами синхронизации - крититческими секциями, защелками и семафорами.
Автор: envenom
Дата сообщения: 20.02.2008 11:52
Через некоторое время после установки CodeGear RAD Studio 2007 при запуске начинает требовать серийник Enterprise Core Objects 4, причем это окно вылезает также при запуске VS2005, есть ли ключик или кряк для ECO какой нибудь?
Заранее благодарен hxxh@mail.ru.
Автор: jemiko
Дата сообщения: 20.02.2008 12:25
kirillkr

Цитата:
Огромное спасибо. У Вас есть опыт? Можно будет обращаться если возникнут вопросы?

Опыт не большой, но пообщатся можно конечно, ответим по мере возможности (знания) и времени.
Автор: davidyantz
Дата сообщения: 20.02.2008 16:07
Пишу программу на Дельфи, которая использует некую dll (в конкретном случае - twain32.dll). У этой длл-ки есть неприятная особенность - когда источник данных физически не подключен к порту компьютера, то при попытке коннекта к устройству длл-ка выбрасывает на экран окошко с ошибкой, в котором нужно нажить кнопку "ОК".

Я думаю, перехватить этот Exception моя программа не в силах, тогда такой вопрос: как используя ресурсы twain32.dll, определить, подключено ли устройство к компу или нет?

Возможное решение, к которому я сейчас склоняюсь, это создание в моей программе потока, из которого будет вызываться эта dll именно в момент открытия источника данных, а в основной программе повесить WaitForSingleObject на данный поток с временем ожидания 1000-2000 мс, после истечения которого считать, что окошко с ошибкой всё же появилось. Но это решение мне кажется не совсем корректным, потому как неизвестно, будет ли фунциклировать twain32.dll, если не нажать на кнопку "ОК" в окне с ошибкой. (Примечание: моя программа запускается от имени некоего пользователя, и, естественно, залогинившийся на компе юзер не увидит никакого окошка с ошибкой и тем более не сможет ни на что нажать).

Автор: ArtemiyUO
Дата сообщения: 20.02.2008 18:57
Ребята простите за офтоп, но чисто ради Delphi. Может быть кто то еще не знает Codegear проводит очередной опрос мнения разработчиков. Прошу всех ответсвенно проголосовать.
http://www.delphilab.ru/content/view/212/1/
Автор: George_Lucky
Дата сообщения: 21.02.2008 07:12
В моем Кодегире 2007 студия
VCL for Web 9 незарегистрирован, посоветуйте, че сделать, чтоб заработало
Спасибо

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


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