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

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

Автор: ceres578
Дата сообщения: 27.02.2010 18:28
Frodo_Torbins
Не выходит. С обычной формой - пожалуйста, делаю, что хочу, но у меня ActiveX-форма - вместо блокнота беру даже маленький калькулятор - результат такой же, из панели задач калькулятор пропадает, а на форме ActiveX его не видно.
Автор: MegoChelovek
Дата сообщения: 28.02.2010 19:42
Хлопци, помогите решить две задачи......через день их сдавать надо...в голове мыслей вообще никаких.....

11.    Коля Павликов родился 12.5.62(12 мая 1962г.), поэтому он считает «счастливыми» все даты, у которых сумма цифр дня и месяца рождения равна сумме цифр года рождения, исключая век. Ближайшая предыдущая «счастливая» дата-12.4.62. Ближайшая следующая «счастливая» дата-11.6.62. Требуется помочь Коле. Надо написать программу, которая по заданной произвольной дате определяет ближайшие предыдущую и следующую «счастливые» даты любого века.
Найти также «счастливую» дату, у которой в данном веке нет предыдущей, и «счастливую» дату, у которой в данном веке нет следующей. Определить, какая из «счастливых» дат располагается ближе к заданной - предыдущая или следующая. Найти две «счастливые» даты текущего века, которые расположены ближе всего друг к другу.
12.    Бизнесмен собрал предсказания М ведущих астрологов об успешности сделок в различные дни месяца. Предсказания оцениваются по пятибалльной шкале:5-успешная сделка, 1-неуспешная. Бизнесмен считает, что сделка действительно будет успешной, если более 75% предсказаний будут равны 4 или 5. Написать программу, определяющую самые благоприятные для бизнесмена дни согласно предсказаниям.

Добавлено:
и вот такая вот еще, я тут вообще не понимаю что от меня требуеться....может что нить подобное было у кого...

9.    Составить программу, которая имеет 4 формы, в том числе одну главную. Обеспечить переключение с каждой формы на каждую, используя приведенные варианты управления процессом переключения:
1)    кнопки Button и BitBtn;
2)    главное меню;
3)    компоненты ComboBox;
4)    компоненты RadioButton, размещённые в контейнере (RadioGroup, GroupBox, Panel). На разных формах рекомендуется использовать разные контейнеры для исследования различных способов использования компонентов RadioButton .
Обработчики событий для переключения с формы на форму создать частью индивидуальные, частью использовать уже созданные для ранее применённых компонентов.
Программу выполнить в двух версиях. Первая версия при переходах с формы на форму использует методы Show – Hide. Вторая версия использует создание и уничтожение форм в требующийся момент. При этом главная форма создаётся при запуске приложения, используя механизм автосоздания (AutoCreate).
Автор: jonikDk
Дата сообщения: 28.02.2010 20:44
MegoChelovek
тебе наверное лучше в форум работа обратиться !!!

Цитата:
Хлопци, помогите решить две задачи......через день их сдавать надо...в голове мыслей вообще никаких..

мысли должны быть следующие: учиться, учиться и еще раз учиться
или такие: нахера я поступал !!!
Автор: Wahnsinn
Дата сообщения: 01.03.2010 00:02
код неоптимальный, тупо перебор, но пойдет
это определение счастливой даты в большую сторону

Код:
var
dt: tdate;
str_dt: string;
pr: boolean;
begin
dt:=date; //начальная дата
dt:=dt+1; //чтобы не совпала с заданной
pr:=false;
while pr=false do
begin
try
str_dt:=FormatDateTime('dd.mm.yyyy',dt);
if StrToInt(str_dt[1])+StrToInt(str_dt[2])+StrToInt(str_dt[4])+StrToInt(str_dt[5])=StrToInt(str_dt[7])+StrToInt(str_dt[8])+StrToInt(str_dt[9])+StrToInt(str_dt[10]) then
begin
pr:=true;
ShowMessage(str_dt); //вывод строкового значения на экран
end
else dt:=dt+1;
except
end;
end;
end;
Автор: MegoChelovek
Дата сообщения: 01.03.2010 09:21
jonikDk
я понимаю твою обеспокоенность насчет тогда что я вот так вот прошу решения....но мыслей и впраду не было никаких, даже не знал с чего начать. теперь более менее все прояснилось

Wahnsinn
Спасибо за код, пока его еще не пробовал (еще не дома пока), но уже примерон знаю как делать задачу про астрологов и как правильно оформить форму )

насчет дат, тоже сообразил как делать, только вот есть один вопрос :
например дана дата 13.7.88. какая их этих дат расположена ближе 13.8.45 или 14.11.99 к 13.7.88 ? как определить это программно ? ( из этого вытекает решение на предпоследний и последний вопрос) ... насчет сравнения модулей не понял маленько, если можешь - выложи код )



а насчет последней задачи есть какие нить соображения ?
Автор: SIgor33
Дата сообщения: 01.03.2010 10:14
подскажите ни кто не использовал в своих приложениях на delphi graphviz для виаулизации графа.
если есть наработки буду благодарен
Автор: Wahnsinn
Дата сообщения: 01.03.2010 10:19

Код:
var
dt1,dt2,dt:tdatetime;
begin
dt:=StrToDate('13.07.1988');
dt1:=StrToDate('13.08.1945');
dt2:=StrToDate('14.11.1999');

//заранее знаем каког ознака будет разность, тч просто вычитаем
if ((dt-dt1)<(dt2-dt)) then ShowMessage(DateToStr(dt1) + ' ближе к '+ DateToStr(dt)+' чем '+DateToStr(dt2))
else ShowMessage(DateToStr(dt2) + ' ближе к '+ DateToStr(dt)+' чем '+DateToStr(dt1));
end;
Автор: V1s1ter
Дата сообщения: 01.03.2010 10:55
MegoChelovek
В дополнение к Wahnsinn
В место
if ((dt-dt1)<(dt2-dt)) then
Предлагаю
if Abs(dt-dt1) < Abs(dt2-dt) then
Автор: Wahnsinn
Дата сообщения: 01.03.2010 11:47

Цитата:
Найти две «счастливые» даты текущего века, которые расположены ближе всего друг к другу.

тем же простым перебором и вынесением поиска счастливых дат в функции с ограничением краев на век показал, что для 21 века это следующие даты [more]
data: 01.05.2005
30.04.2005
02.05.2005

data: 01.07.2007
30.06.2007
02.07.2007

data: 01.12.2012
30.11.2012
02.12.2012

data: 01.05.2014
30.04.2014
02.05.2014

data: 01.07.2016
30.06.2016
02.07.2016

data: 01.12.2021
30.11.2021
02.12.2021

data: 01.05.2023
30.04.2023
02.05.2023

data: 01.07.2025
30.06.2025
02.07.2025

data: 01.12.2030
30.11.2030
02.12.2030

data: 01.05.2032
30.04.2032
02.05.2032

data: 01.07.2034
30.06.2034
02.07.2034

data: 01.05.2041
30.04.2041
02.05.2041

data: 01.07.2043
30.06.2043
02.07.2043

data: 01.05.2050
30.04.2050
02.05.2050

data: 01.07.2052
30.06.2052
02.07.2052

data: 01.07.2061
30.06.2061
02.07.2061

data: 01.07.2070
30.06.2070
02.07.2070
[/more]
Автор: KurkSS
Дата сообщения: 01.03.2010 14:09
здрасте все!

Помогите советом...

Есть два обьекта Главный и рабочий....
главный даёт указание рабочему обработать данные, но НУЖНО СЛЕДУЮЩЕЕ ИЗМЕНИТЬ

Главный делает
Рабочий.Данные:="данные для обработки";
Рабочий.Выполняй;//рабочий в отдельном потоке запустит процес обработки данных и
//будет выполнен возврат из процедуры.

Завершать:=Ложь;
ПОКА Завершать<>Истина ДЕЛАЙ
НАЧАЛО
Интервал_времени:=СколькоМожноПодождать();
Если ИнтервалВремени=0 ИЛИ Завершено=Истина
ТОГДА Завершать:=Истина
Иначе sleep(ИнтервалВремени);
КОНЕЦ;
Если Завершено<>Истина ТОГДА НАчало Рабачий.Хватит;.............КОнец
...................................

Рабочий.Выполняй//запускает запуск в отдельном потоке обработку данных

Поток при нормальном завершении своей работы делает через synchronyze Главный.Завершено=Истина

Рабочий.Хватит// зовершает принудительно поток.

Что мне надо.... чтобы при нормальном завершении потока он не только сообщал о завершении но и выводил из ожидания главный обьект....

Тоесть можно конечно сделать чтоб главный усыпал скажем на малый промежуток времени
и часто в холостую просыпался... но так как диапазоны времени могут варьироваться от долей секунды до часов даже... хотелось бы както оптимальней сделать....

Заранее спасибо
Автор: Wahnsinn
Дата сообщения: 01.03.2010 15:28
у тебя sleep используется только по сути для принудительного завершения, выведи к примеру процедуру по завершению рабочего потока в отдельный поток с параметром времени, если дочерний завершится раньше то завершаешь тот второй поток из главного иначе тот спустя заданное время прибьет рабочий.
Автор: V1s1ter
Дата сообщения: 01.03.2010 15:49
KurkSS
Для начала напомню о теге MORE, который из шапки
Теперь по существу, как вариант можно разбить процедуру на две: первая запускает процесс, вторая обрабатывает результат работы процесса. Вторая процедура запускается рабочим процессом, который потом уничтожается. И никаких Sleep-ов.
Запуск второй процедуры из рабочего процесса можео сделать и не напрямую, а через посылку сообщения.
Автор: Maks150988
Дата сообщения: 01.03.2010 20:49
Всем привет, назрел вопрос такого рода. Допустим есть массив:

Код: AnsiList: Array [1..100] of AnsiString;
Автор: psa1974
Дата сообщения: 01.03.2010 21:11
Maks150988
если не принципиально использовать оператор case, напиши так:

Код: WM_COMMAND:
begin
if LoWord(wParam) - 1 in [Low(AnsiList)..High(AnsiList)] then
begin
end;
end;
Автор: Maks150988
Дата сообщения: 01.03.2010 22:10
psa1974
Во, точно нужно.
Автор: KurkSS
Дата сообщения: 02.03.2010 01:17

Цитата:
Wahnsinn

я правильно понял тебя?

1)Главный.ВызовВОтдельном потоке поцедуры, которая усыпает
на заданный период времени, а вконце рабочему обьекту даёт команду на
аварийное завершение.

2)даём команду рабочему обьекту на выполнение.....

Так а главному обьекту то что в это время делать????
если 2) вызов метода и ожидать его завершения.... то как собственно 1)
тогда должен завершить принудительно это всё дело???
Зы- я не профи а тока-тока учусь.... могу тормозить на простом.... можно
шаблон кода, я наверно так быстрее пойму.


Цитата:
V1s1ter

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


можно шаблон кода для случая[more]
Main:Tmainobject; work:Tworkobject;
work.do() - метод который начинает работу инициируя поток, а сам недожидаясь
окончания завершаеться
work.stop() - метод который может аварийно завершить работу потока.
work.finish:boolean; - поле через которое поток сигнализирует о нормальном
завершении[/more]
Автор: V1s1ter
Дата сообщения: 02.03.2010 02:49
KurkSS
Если я Вас правильно понял, то допустим управление происходит по нажатию на кнопку, тогда
[more]

Код:
Tform1 = clase..
Main: Tmainobject; // подразумевается что это тип наследник потока
work: Tworkobject; // подразумевается что это тип наследник потока
end;

procedure Form1.OnBtnStartClick;
begin
// создаем оба объекта
Main := Tmainobject.Create;
work := Tworkobject.Create;
work.MainPtr := Main; // MainPtr это поле объекта work - указатель на главный процесс
work.Data := ...
work.do; // запускаем в работу паралельный поток
end;

procedure Form1.OnBtnAbortClick;
begin
if Assigned(work) do work.stop; // обрабатыаем аварийный стоп, здесь и про Main не забыть надо
end;

procedure Tworkobject.finish;
begin
// это уже метод рабочего процесса
MainPtr.ResultData := ... // возвращаем в Главный процесс результат
MainPtr.WorkFinished; // говорим главному процессу что все закончено
Terminate; // горохаем себя, то есть рабочий процесс
end;

procedure Tmainobject.WorkFinished;
begin
// это уже метод Главного процесса
здесь продалжаем обрабатывать то что в получили в ResultData
end;
Автор: SIgor33
Дата сообщения: 02.03.2010 08:37
подскажите как считать значение из защищенной ячейки excel.
из обычной я делаю так:
var
ExcelApp ,
Workbook:OleVariant;
Data:Real;
begin
ExcelApp.DisplayAlerts:=False;
ExcelApp.AskToUpdateLinks:=False;
Workbook := ExcelApp.WorkBooks.open(FileName);
Data:= Workbook.Sheets['Лист'].Cells[1,1];
end;
а если она защищена то вываливается ошибка
Автор: Wahnsinn
Дата сообщения: 03.03.2010 11:33
SIgor33

Код:
xls := CreateOLEObject('Excel.Application');
xlw := xls.WorkBooks.Open(FileName := 'd:\test.xls', Password := 'test', ReadOnly := True);
Автор: SIgor33
Дата сообщения: 03.03.2010 13:11
Wahnsinn
Вы не много не так поняли файл я открываю нормально и без пароля. Именно надо считать данные из защищенной ячейки. конечно можно снять командой unprotect защиту с листа. Но пароль меняется периодически. записывать данные в файл не нужно.
Но ваш метод то же работает Спасибо
Автор: Wahnsinn
Дата сообщения: 03.03.2010 15:01
SIgor33

Код:
uses ComObj;
...
var
XLApp, Sheet: OLEVariant;
path, data: string;
begin
path:='d:\test.xls';
XLApp := CreateOleObject('Excel.Application');
XLApp.Workbooks.Open(path);
Sheet := XLApp.Workbooks[ExtractFileName(path)].WorkSheets[1];
data := XLApp.Cells[3,3];
...
Sheet := UnAssigned;
XLApp := UnAssigned;
end;
Автор: Maks150988
Дата сообщения: 04.03.2010 10:57
Всем привет. такой вопрос. Мне нужно использовать OLE в программе, но я сделал свои модули, нужен чистый Api, а не суповой набор стандартных модулей. Так вот где надо вызывать функции CoInitialize и CoUninitialize, в initialization и finalization модуля или вначале выполнения программы инициализировать? Пробовал вызывать CoInitialize перед выполнением кода по созданию OLE объекта, вываливается в исключение.
Сейчас сделал вызов этих функций в initialization и finalization, все работает номрально, но все же как-то думается это не самый оптимальный способ.
Автор: AviDen
Дата сообщения: 05.03.2010 18:05
psa1974


Цитата:
Maks150988
если не принципиально использовать оператор case, напиши так:

Код: WM_COMMAND:
begin
if LoWord(wParam) - 1 in [Low(AnsiList)..High(AnsiList)] then
begin
end;
end;
Автор: Maks150988
Дата сообщения: 05.03.2010 18:59
AviDen

Код в самой программе, никаких своих dll не использую.


Код: procedure UpdateTaskbarVisibleWindow;
var
TaskBar: ITaskBarList;
pfList : IUnknown;
hr : HRESULT;
begin

CoInitialize(nil);

try

hr := CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, pfList);

if (hr = S_OK) then
try
TaskBar := pfList as ITaskbarList;
if (TaskBar.HrInit = S_OK) then

if Boolean(dwTaskWindow) then
begin
TaskBar.AddTab(hMain);
TaskBar.ActivateTab(hMain);
end
else
TaskBar.DeleteTab(hMain);

except;
end;

CoUninitialize;

except
end;

end;
Автор: AviDen
Дата сообщения: 05.03.2010 20:02
Maks150988
Во-первых правильно так:

Код: CoInitialize(nil);
Try
...
Finally
CoUninitialize;
End;
Автор: Maks150988
Дата сообщения: 05.03.2010 21:00
AviDen
Да я тоже на 7 версии, но я свой модуль делал.


Код: const
CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';

type
ITaskbarList = interface
['{56FDF342-FD6D-11d0-958A-006097C9A090}']
function HrInit: HRESULT; stdcall;
function AddTab(hwnd: Cardinal): HRESULT; stdcall;
function DeleteTab(hwnd: Cardinal): HRESULT; stdcall;
function ActivateTab(hwnd: Cardinal): HRESULT; stdcall;
function SetActiveAlt(hwnd: Cardinal): HRESULT; stdcall;
end;
Автор: Odysseos
Дата сообщения: 05.03.2010 23:27
Maks150988

Я правильно понимаю, что это - попытка заюзать ProgressBar в панели задач Windows 7? Посмотрите вот на это - Windows 7 Components. Может быть, тут уже все есть?.. Сам ими пользуюсь, несмотря на beta-статус - прекрасно работают.
Автор: andrewtishkin
Дата сообщения: 06.03.2010 00:07

Цитата:
попытка заюзать ProgressBar в панели задач Windows 7?

Если нужно реализовать Progress Bars, Icon Overlays или Thumbnail Toolbars (названия беру согласно MSDN) и используется Delphi 2010, то там можно воспользоваться объявленными в ShlObj интерфейсами. Примеры есть в исходниках к книжке Delphi 2010 Handbook (папка 05\Win7Taskbar)

А насчёт остальных плюшек - лучше "Windows 7 Components" и правда ничего нет (imho)
Автор: Maks150988
Дата сообщения: 06.03.2010 10:09
Да нет же, мне нужно скрывать/отображать окно мой программы в таскбаре. Есть конечно другой способ через SetWindowLong, но я проверял на висте и семерке - не работает что-то, пришлось через этот интерфейс делать. Через него все впорядке, но опять же что за фигня с инициализацией этого OLE. Ошибок нет только если в initialization явно указать CoInitialize. Неужто свободно нельзя проинициализировать эту долбанную COM библиотеку?
Автор: AviDen
Дата сообщения: 06.03.2010 14:24
Maks150988

Всё выяснилось, как только я попробовал наваять тестовый проектик с кодом, аналогичным твоему.
Ошибка на самом деле возникает не в CoInitialize, а уже в CoUninitialize, и потому, что на момент вызова данной функции не все выделенные OLE-ресурсы освобождены, а именно объекты TaskBar и pfList.

Delphi-то их освободит автоматически, но лишь в конце функции, одновременно с оператором end, а нас это не устаивает. Таким образом, твой пример надо переписать так:


Код:
procedure UpdateTaskbarVisibleWindow;
var
TaskBar: ITaskBarList;
pfList : IUnknown;
hr : HRESULT;
begin

CoInitialize(nil);

try

hr := CoCreateInstance(CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, pfList);

if (hr = S_OK) then
begin
TaskBar := pfList as ITaskbarList;
if (TaskBar.HrInit = S_OK) then

if Boolean(dwTaskWindow) then
begin
TaskBar.AddTab(hMain);
TaskBar.ActivateTab(hMain);
end
else
TaskBar.DeleteTab(hMain);
end;

Finally
TaskBar:= Nil;
pfList:= Nil;
CoUninitialize;
end;

end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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