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

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

Автор: V1s1ter
Дата сообщения: 08.10.2009 13:14
d0m1nat0r321
Развивая предложеное выше
В свойствах формы выставляем KeyPreview = True;
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (ActiveControl = dbgrd1) and
(Key = Chr(VK_DOWN)) and
(dbgrd1.DataSource.DataSet.Eof)
then Key = #0;
end;
Автор: d0m1nat0r321
Дата сообщения: 08.10.2009 13:35

Цитата:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (ActiveControl = dbgrid1) and
(Key = Chr(VK_DOWN)) and
(dbgrid1.DataSource.DataSet.Eof)
then Key:= #0;
end;
- тоже самое, он не реагирует
Автор: greenpc
Дата сообщения: 08.10.2009 13:43
d0m1nat0r321
а если на DataSet BeforeInsert(DataSet: TDataSet)
DataSet.Cancel если dbgrid1.DataSource.DataSet.Eof
Автор: d0m1nat0r321
Дата сообщения: 08.10.2009 13:59

Цитата:
Data

Цитата:
а если на DataSet BeforeInsert(DataSet: TDataSet)
DataSet.Cancel если dbgrid1.DataSource.DataSet.Eof
- тогда невозможно будет добавлять даные (если виделить последнюю запись и добавить с помощь кнопок tdbnavigator'а он тож не пустит), надо именно на клавишу, или чтото с хорошой умовой



Добавлено:

Цитата:
а если на DataSet BeforeInsert(DataSet: TDataSet)
DataSet.Cancel если dbgrid1.DataSource.DataSet.Eof
есть придумал, я поставил ево в обработчик afterinsert и изменил позыцыю ето дало возможность добавлять с навигатора и убрать добавление с клавиатуры).

БОЛЬШОЕ спосибо наконецто доделаю )))
Автор: V1s1ter
Дата сообщения: 08.10.2009 14:16
d0m1nat0r321

Цитата:
тоже самое, он не реагирует

Прости не проверил мысль, теперь проверил - работает:

Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (ActiveControl = DBGrid1) and (Key = VK_DOWN) then
if dbgrid1.DataSource.DataSet.Eof then Key:= 0
else begin
dbgrid1.DataSource.DataSet.Next;
if dbgrid1.DataSource.DataSet.Eof then Key:= 0
else dbgrid1.DataSource.DataSet.Prior;
end;
end;
Автор: d0m1nat0r321
Дата сообщения: 08.10.2009 14:21
я уже зделал по другому с помощю afterinsert

Цитата:
if dbgrid1.DataSource.DataSet.Eof then clientDataSet1.Cancel else begin
dbgrid1.Columns[0].ReadOnly:=false;
ClientDataSet1.Fields[0].AsString:=inttostr(clientdataset1.RecordCount+1);
dbgrid1.Columns[0].ReadOnly:=true end;
ну и до етого сменил позыцыю
Автор: psa1974
Дата сообщения: 08.10.2009 14:28
d0m1nat0r321
Продолжаю развитие темы, предложенной greenpc
Во-первых. Событие OnKeyPress возникает не для каждой нажатой клавиши, а только для тех, которые соответствуют какому -то символу, т.е. для клавиши Down это событие не возникнет. (OnKeyPress возникает при получении сообщения WM_CHAR, а вот это сообщение вставляется в очередь сообщений ф-цией TranslateMessage при получении сообщения от системы WM_KEYDOWN).
А вот событие OnKeyDown генерируется для ЛЮБОЙ нажатой клавиши (возникает при получении от системы WM_KEYDOWN), поэтому следует попробовать написать обработчик именно этого события.
Т.е. OnKeyDown возникает всегда, а OnKeyPress - только для символьных клавиш!
Если не поможет, есть на уме еще одна идея...


Добавлено:
А ну, пока писал, V1s1ter уже это на примере показал
Автор: d0m1nat0r321
Дата сообщения: 08.10.2009 14:36
я уже зделал )) но по другому с кейдовн ещо не пробувал...

Добавлено:
)))
Автор: VandB
Дата сообщения: 08.10.2009 15:05
V1s1ter
Большое вам спасибо из этой версии установилось все
Автор: V1s1ter
Дата сообщения: 08.10.2009 15:12
d0m1nat0r321

Цитата:
я уже зделал по другому с помощю afterinsert

Смотрите, чтоб этот afterinsert, не мешал нормальной вставке записей, в том числе и программной, ведь он будет вызываться не только при нажатии down...
Автор: d0m1nat0r321
Дата сообщения: 08.10.2009 15:31

Цитата:
Смотрите, чтоб этот afterinsert, не мешал нормальной вставке записей, в том числе и программной, ведь он будет вызываться не только при нажатии down...
я знаю я уже ево использовал для универсального ключа (етим ключом я создаю подбазы(как в 1с код и тип даних для оприделенного регистра, в даном методе к опредиленной записи)), если чтото мне надобудет без идентификатора прописать тогда использую ваш метод ))
Автор: Maks150988
Дата сообщения: 08.10.2009 18:13
greenpc
Да, спасибо. Я как раз на днях сделал себе юнит для рабоыт со службами. Думаю может присутствующим в этой теме он тоже пригодиться.
[more=Дальше]unit F_WinServ;

interface

uses
Windows, WinSvc;

function IsServiceExistsW(lpSvcName: PWideChar): Boolean;
function IsServiceRunningW(lpSvcName: PWideChar): Boolean;
function IsServiceStoppedW(lpSvcName: PWideChar): Boolean;
function SetStopServiceW(lpSvcName: PWideChar): Boolean;
function SetStartServiceW(lpSvcName: PWideChar): Boolean;

implementation

var
hManager: SC_HANDLE;

//

function IsServiceExistsW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_QUERY_STATUS //
);
if (hService <> 0) then
try
Result := (hService <> 0);
finally
CloseServiceHandle(hService);
end;
end;

//

function IsServiceRunningW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_QUERY_STATUS //
);
if (hService <> 0) then
try
QueryServiceStatus(
hService,
ServStat
);
Result := (ServStat.dwCurrentState = SERVICE_RUNNING);
finally
CloseServiceHandle(hService);
end;
end;

//

function IsServiceStoppedW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_QUERY_STATUS //
);
if (hService <> 0) then
try
QueryServiceStatus(
hService,
ServStat
);
Result := (ServStat.dwCurrentState = SERVICE_STOPPED);
finally
CloseServiceHandle(hService);
end;
end;

//

function SetStopServiceW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ServStat: TServiceStatus;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_STOP //
);
if (hService <> 0) then
try
Result := ControlService(
hService, //
SERVICE_CONTROL_STOP, //
ServStat //
);
finally
CloseServiceHandle(hService);
end;
end;

//

function SetStartServiceW(lpSvcName: PWideChar): Boolean;
var
hService: SC_HANDLE;
ArgServ : PWideChar;
begin
Result := FALSE;
hService := OpenServiceW(
hManager, //
lpSvcName, //
SERVICE_START //
);
if (hService <> 0) then
try
Result := StartServiceW(
hService, //
0, //
ArgServ //
);
finally
CloseServiceHandle(hService);
end;
end;

initialization

hManager := OpenSCManagerW(
nil, //
nil, //
SC_MANAGER_CONNECT //
);

finalization

if (hManager <> 0) then
CloseServiceHandle(
hManager
);

end.[/more]
psa1974
Загружаю диалог из ресурсов и запускаю отдельный поток при инициализации диалога. Отдельный поток нужен чтобы можно было отображать данные в листбоксе по мере продвижения результата от выполнения вспомогательных функций, а манипуляции с диалогом вплоть до интерфейса идут уже в основном потоке приложения.
ProcessMessage неохота использовать, с ним все рывками получается (по крайней мере сколько не использовал раньше код nonvcl этой процедуры, фигня какая-то, особенно сильно это хаметно когда требуется при выполнении чего-либо такого объемистого изменять размер окна, отрисовка окна капец кусками идет, да и система вопит иногда что приложение не отвечает), да и все равно поток отдельный лучше на мой взгляд, пускай себе там крутится цикл, все равно его грохнуть можно в любой момент.
[more=Сделал так, вроде работает] //
GetText := 'dhcp';

//

if IsServiceRunningW(@GetText[1]) then
begin
s := FormatW(LoadstrW(RC_STRING_SRVSTOP), [GetText]);
SendMessageW(GetDlgItem(hRtp, IDC_LISTBOX_RUNLOG), LB_ADDSTRING, 0, Integer(@s[1]));

//

if SetStopServiceW(@GetText[1]) then
begin
Sleep(5000);

// проверяем статус и если служба еще выполняется, то обрабатываем
// сообщения в очереди и заново проверяем.

while (IsServiceRunningW(@GetText[1])) do
begin
Sleep(1000);
end;

//

s := FormatW(LoadstrW(RC_STRING_SRVSTART), [GetText]);
SendMessageW(GetDlgItem(hRtp, IDC_LISTBOX_RUNLOG), LB_ADDSTRING, 0, Integer(@s[1]));
SetStartServiceW(@GetText[1]);
end;
end
else
begin

//

s := FormatW(LoadstrW(RC_STRING_SRVSTART), [GetText]);
SendMessageW(GetDlgItem(hRtp, IDC_LISTBOX_RUNLOG), LB_ADDSTRING, 0, Integer(@s[1]));
SetStartServiceW(@GetText[1]);
end;
[/more]
Всем спасибо за подсказки.
Автор: psa1974
Дата сообщения: 08.10.2009 20:27
Maks150988
Насчет отдельного потока - понятно. А модулек забрал - никогда не знаешь заранее где что пригодится
Автор: Grande
Дата сообщения: 09.10.2009 05:59
Вот на такой глюк наткнулся в Advanced Import версии 3.1.0.8:
При импорте в дбгрид из xls при количестве строк более 70 происходит Access Violation.
Причем дело вовсе не в записях - установил эмпирическим путем.
Откатился на версию от января 2008 - тот же xls в тот же DBGrid залетает быстрее звука.
Никто не сталкивался с подобным?
P.S. У меня привычка: при появлении новых версий библиотек выкидывать старые. Так я еле нашел на просторах инета старую версию, когда до меня доехало, что глюк в Advanced Import.
Автор: greenpc
Дата сообщения: 09.10.2009 07:14
Maks150988
а вообще стОит почитать истоки
_http://msdn.microsoft.com/en-us/library/ms686953(VS.85).aspx
Автор: YuriyRR
Дата сообщения: 13.10.2009 00:09
Кто подскажет как сделать перехват вывода консоли если в консоль выводится больше 32к символов.
Если ставлю хук обрабатываются события
EVENT_CONSOLE_CARET:
EVENT_CONSOLE_END_APPLICATION:
EVENT_CONSOLE_UPDATE_REGION:
EVENT_CONSOLE_UPDATE_SIMPLE:
EVENT_CONSOLE_UPDATE_SCROLL:
EVENT_CONSOLE_LAYOUT:
EVENT_CONSOLE_START_APPLICATION:
когда начинается скролл в консоле CARET показывает одно и то-же значение
т.о. асинхронно невозможно определиться сколько строк пришло в консоль
Сейчас так
...
if coninfo.dwCursorPosition.Y > (csize - 600) then
begin
// по мере заполнения прибавляем размер буфера консоли для того чтобы исключить скроллинг буфера экрана
csize := min(csize + add_lines, 32767); // Ограничение по количеству строк в консоли
xy.X := coninfo.dwSize.X;
xy.Y := csize;
SetConsoleScreenBufferSize(СonsHndl, xy);
end;
...
ReadConsoleOutputCharacter(GBackFrm.ConsHndl, szBuffer, ToWCount, xy, WCount);
Автор: ShIvADeSt
Дата сообщения: 13.10.2009 01:15
YuriyRR
ИМХО AttachThreadInput в инете куча инфы по перехвату того, что вводят в консоли.
Автор: YuriyRR
Дата сообщения: 13.10.2009 02:33
ShIvADeSt
Это про перехват вывода консоли
Забыл добавить что это конечно работает через пипе только в случае с пипе неразрешимая проблема с буферизацией вывода, отчего приемник получает поток кусками, что не приемлемо
Автор: mdid
Дата сообщения: 13.10.2009 20:31
вопрос не критичный..но мне просто интересно почему так...тоесть н первый случай

Код:
list : TStringList;


list:=TStringList.Create; <=
ComboBox1.Items.Clear;
list:=GetSect(Form2.path+'\Enu.ini','Тип цен');
for I:= 0 to List.Count - 1 do
ComboBox1.Items.Add(List.Strings[i]);
ComboBox1.ItemIndex:=0;
list.Destroy;
Автор: Frodo_Torbins
Дата сообщения: 13.10.2009 20:56
mdid
Ваш list - всего лишь указатель на обьект (только благодаря магии компилятора нам не приходится каждый раз писать list^). Тут вы присваиваете этому указателю одно значение:
Код: list:=TStringList.Create;
Автор: mdid
Дата сообщения: 13.10.2009 21:35
пасиб...понял
Автор: Jonnywin
Дата сообщения: 14.10.2009 05:46
Подскажите, знающие люди, запарился уже... Как сделать, чтоб код события вставлялся в конец исходного кода программы, а не в середину (в алфавитном порядке???). Поясню - я бросил на форму кнопку, тыкнул по ней два раза мышью - автоматически создался код обработки нажатия кнопки и меня переносят в исходный код программы. Так вот, обработчик нажатия НЕ ДОБАВЛЯЕТСЯ в конец исходного кода, а вставляется в середину, скорее всего в алфавитном порядке или вообще хрен знает как. А как сделать, чтоб добавлялся в конец?

Надеюсь, понятно объяснил. Заранее спасибо.
Автор: ShIvADeSt
Дата сообщения: 14.10.2009 05:49
Jonnywin

Цитата:
Так вот, обработчик нажатия НЕ ДОБАВЛЯЕТСЯ в конец исходного кода, а вставляется в середину, скорее всего в алфавитном порядке или вообще хрен знает как.

У меня добавляется в конец. Версия Дельфи как минимум нужна.
Автор: Jonnywin
Дата сообщения: 14.10.2009 06:13

Цитата:
У меня добавляется в конец. Версия Дельфи как минимум нужна.

Виноват. Delphi 2009. Раньше работал в "семерке" - проблем не было.
Автор: psa1974
Дата сообщения: 14.10.2009 08:21
Jonnywin
Такаое поведение началось с тех пор как интерфейс Дельфи стал "MS Visual Studio"-образным...
Тоже поначалу бесило, потом привык. Но если кто подскажет как побороть, буду рад, хотя мне кажется, что нигде такой "галочки" не найдется. Разве что писать своего эксперта...
Автор: Varenik
Дата сообщения: 14.10.2009 11:20
psa1974
При пользовании ModelMaker CodeExplorer есть настройки сортировки как интерфейсной части, так и реализации
Автор: YuriyRR
Дата сообщения: 14.10.2009 14:13
Jonnywin
Рекомендую GExpert Ctrl+G список функций и методов с поиском + букмарки
и уже не важно в каком порядке они в коде
Автор: SIgor33
Дата сообщения: 15.10.2009 14:05
Как програмнно из delphi удалить макрос с книги excel
Автор: AlexMoor
Дата сообщения: 15.10.2009 17:13
Уважаемые гуру!
Помогите пожалуйста со следующей проблемой.
Имеем: TActionManager, TActionToolBar;
Одна из кнопок тулбара в зависимости от ситуации должна иметь или не иметь выпадающее меню (назовем его так, хотя конечно это тоже всего-лишь TActionClientItem'ы), и для разных случаев разное.
Чтобы не создавать эти меню руками, собрал их все в еще одном TActionManager ( TActionBarItem'ы -> TActionClients). Теперь в зависимости от ситуации пытаюсь присвоить:
ActionManager.ActionBars[№].Items[№].Items.Assign(какой-то из дополнительных TActionClients). Всё проходит без ошибок, у ActionManager.ActionBars[X].Items[X] (т.е. конечной кнопки) изменяется и Items.Count, и Items.VisibleCount, но кнопка не перерисовывается, т.е. у нее не появляется DropDown-стрелка. Попытки рефрешить тулбар ни к чему не приводят. Я в чем-то не прав или это глюк? Похожий фокус только на основе простых TToolButton и PopupMenu работает у меня уже очень много лет в многих приложениях. Может зря трогал?
Автор: V1s1ter
Дата сообщения: 15.10.2009 17:52
Jonnywin
psa1974

Цитата:
Как сделать, чтоб код события вставлялся в конец исходного кода программы,

Всех настроек не знаю, то вот порядок работы:
Если методы размещены по алфавиту или их нет, то методы вставляются в алфавитном порядке, инаже по мере обявления, то есть в конец.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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