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

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

Автор: Delta RuBoard
Дата сообщения: 08.12.2009 22:26
snike555

Цитата:
Ну ты выдал, изобретаем велосипед?

http://docs.luksian.com/programming/delphi/prsokdelph/
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
http://www.realcoding.net/article/view/1833

Если поискать можно простейшие примеры исходников найти по работе с сокетами.

да гори оно в аду! не я изобретаю... препод изобретает. ссылки не помогают. в одной ТСерверСоке, а нужно Винсокет. Во второй ссылке тот же код который я вылаживал на 51й странице, на консольном режиме, а нужно именно форм аплик

Frodo_Torbins
спасибо, интересно, почитаемс... надеюсь воздастся
Автор: snike555
Дата сообщения: 08.12.2009 23:47
Delta RuBoard

Тогда действительно в отдельном потоке чтобы программа не висла, или как вариант добавить в цикл Application.ProcessMessage чтобы программа реагировала на пользователя, но в таком случае процесс сканирования запускать не на создание формы, а на нажатие кнопки типа "сканировать". За такой вариант в продакшен прогах конечно руки отрывать, потому как по уму в отдельном потоке надо делать, как уже было предложено, но ради того чтобы сдать преподу и такой вариант может прокатить.
Автор: Delta RuBoard
Дата сообщения: 08.12.2009 23:57
так и не допер как вынести в отдельный поток.. у меня наглухо виснит компилятор O_O
Автор: psa1974
Дата сообщения: 09.12.2009 00:13
Delta RuBoard
если требований к инструментарию нет, почитай статью Выполнение кода в потоке без выделения его в процедуру. Удобная вещь, сам часто юзаю
Там все расписано на пальцах и есть архив с исходниками,
[more=Общая идея]
// Этот код выполняется в главном потоке (например, Button1Click)
EnterWorkerThread;
try
{ Этот код выполняется во вторичном потоке }
{ Хотя это код Button1Click, но он выполняется, как если бы он был помещён в TThread.Execute. }
{ рисуешь тут свой цикл, при этом скоко бы он не выполнялся, интерфейс программы
не замораживается, само собой}
finally
LeaveWorkerThread;
end;
// Этот код выполняется в главном потоке
end;[/more]
Автор: Delta RuBoard
Дата сообщения: 09.12.2009 00:17
спасибо, качаю турбо делфи, на котором собственно и нужно писать, и делфи 2008, посмотрим, возможно там не будет зависания при компилировании... ибо ошибка в среднем 4 раза из 5..
Автор: psa1974
Дата сообщения: 09.12.2009 00:34
Delta RuBoard
вот если честно, не пойму, что надо наваять, чтоб сама среда при компиляции висла... Ладно бы еще в процессе трассировки... Если что - скинь тестовый пример, чтоб можно было компильнуть, посмотрим
Автор: Delta RuBoard
Дата сообщения: 09.12.2009 00:40
:D да специально подвесить это на раз два
нужно написать чат на винсоках =\

ну простейший пример при котором виснит..

блин.. запустил случайно откомпиленый файл.. зависло все

[more]unit test;
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Hello World!');
end;

end.[/more]

даже так зависло

Добавлено:
я хз что у меня с делфи стряслось...
Автор: psa1974
Дата сообщения: 09.12.2009 01:00
Delta RuBoard

Цитата:
да специально подвесить это на раз два

Не поверишь, за все время своей програмистской деятельности при компиляции среда ни разу не зависала (бывало при отладке, но это уже другое...)
Однозначно у тебя какая-то лажа или с Дельфи или с системой (что вероятнее). Ели зависает даже пустой проект (ну почти пустой - одна кнопка на форме и обработчик ни как не могут приводить к таким последствиям).
Автор: delover
Дата сообщения: 09.12.2009 10:24
Delta RuBoard
Чтобы приложение не зависало, есть специальный компонент, помоему TIdAntiFreeze. Но чтобы выйти из зацикленного цикла, нужен ещё один компонент, такого компонента я не знаю, пользуюсь обычно самопальными процедурками.
Автор: greenpc
Дата сообщения: 09.12.2009 11:15
delover

Цитата:
TIdAntiFreeze

не катит. работает только с индийцами. те надо все на них писать

Цитата:
Поскольку пользовательский интерфейс замораживается только при вызове блокирующих сокетов в главном кодовом потоке, TIdAntiFreeze влияет только на вызовы Indy, сделанные из главного кодового потока. Если приложение использует вызовы Indy из других потоков, TIdAntiFreeze не требуется. Но если используется, то влияет на вызовы сделанные только из главного кодового потока.

Delta RuBoard
_http://www.coderprofile.com/networks/source-codes/142/delphi-clientserver-winsock-example
чуть чуть напильником
Автор: Aleksandr N
Дата сообщения: 09.12.2009 11:37
Имеется интересная ситуация. Определяем стандартным образом способ подачи бумаги
[more]
FillChar(BinValues, SizeOf(BinValues), 0);
BinCount := DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, @BinValues[0], nil);
if BinCount > 0 then
begin
GetMem(BinNames, BinCount * 24 * sizeof(char));
GetMem(BinValues, BinCount * 24 * sizeof(char));
try
DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINNAMES, Pointer(BinNames), nil);
DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, Pointer(BinValues), nil);
FBins := TStringList.Create;
for I := 0 to BinCount - 1 do
begin
BinName := BinNames^[I];
FBins.AddObject(BinName, TObject(BinValues^[I]));
end;
finally
FreeMem(BinNames, BinCount * 24 * sizeof(char));
FreeMem(BinValues, BinCount * 24 * sizeof(char));
end;
end;

Имеется некий принтер в драйверах которого способы подачи бумаги определены как: "Автоматическое устройство подачи" и "Ручное устройство подачи". При данном способе определения, программа выдаёт только 24 символа:



Пытался вместо параметра "24" поставить "40". В одном случае это ни к чему не приводило, в другом из этого получилось:



Вся проблема в том, что при этом программа либо выдаёт ошибку, либо молча вышибается. Поставив это между try except - программа ошибок на экран не выдаёт, но ведёт себя крайне неадекватно.
Вопрос: можно что-то в этом коде исправить чтобы выдавался весь текст. Как я предполагаю в этом случае ошибок быть не должно. Или может есть другой способ определения способа подачи бумаги.
[/more]

P.S. Поставить нормальный драйвер принтера не предлагать - я обратился в ветку по программированию...

Вопрос выведен в отдельную тему:
http://forum.ru-board.com/topic.cgi?forum=33&topic=10825
Автор: greenpc
Дата сообщения: 09.12.2009 11:46
Aleksandr N
сравните с Torry
_http://www.swissdelphicenter.ch/torry/showcode.php?id=796
и почему нельзя 24 менять на 40

Цитата:
When an application calls the DeviceCapabilities() API with the nIndex parameter set to DC_BINNAMES, 24 bytes are required for each bin name.
Автор: Aleksandr N
Дата сообщения: 09.12.2009 11:52
greenpc
[more]
Я конечно сравню повнимательней, но это не собственноручно написанный код. Во многих других модулях так-же. Такая-же история с компонентом печати от "Девок" где этот параметр определяется иначе. Но суть это не изменило... Вот их код:

BinCount := DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, nil, nil);
if BinCount > 0 then
begin
BinValues := AllocMem(BinSize * BinCount);
try
if DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, PChar(BinValues), nil) <> -1 then
begin
BinNames := AllocMem(BinNameSize * BinCount);
try
if DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINNAMES, PChar(BinNames), nil) <> -1 then
begin
FBins := TStringList.Create;
for I := 0 to BinCount - 1 do
begin
BinName := BinNames^[I];
FBins.AddObject(BinName, TObject(BinValues^[I]));
end;
end;
finally
FreeMem(BinNames, BinNameSize * BinCount);
end;
end;
finally
FreeMem(BinValues, BinSize * BinCount);
end;
end;


Цитата:
и почему нельзя 24 менять на 40


Я посчитал что может это ограничивает...
[/more]
Автор: snike555
Дата сообщения: 09.12.2009 13:43
Когда открываешь какой-нибудь файл офиса нового (Microsoft Office Professional Plus 2010) и запускается офис просто аффигенная заставка (летающая волна анимированная), кто знает как такую самому сделать для своей программы и встроить?
Автор: delover
Дата сообщения: 09.12.2009 21:26
greenpc
Меня раньше интересовал вопрос почему нельзя синхронизироваться с основным потоком если он в sleep и выполнить за него ProcessMessages. И многого можно было бы так и не узнать, но я хотел не об этом. Разве нельзя сделать какой нибудь компонент, чтобы можно было "снять задачу" из диспетчера, ту которая отлаживается в данный момент. И при этом чтобы среда разработки не умерла? По сути умирает поток отладчика, а так как умирает IDE значит это происходит в главном потоке, то есть всё происходит в одном потоке. А может добавив ещё один следящий поток можно было бы делать Deattach автоматически?
Автор: Delta RuBoard
Дата сообщения: 09.12.2009 22:05
psa1974, у меня при

Код: uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, TasksEx, AsyncCalls;
Автор: data man
Дата сообщения: 09.12.2009 22:20
Delta RuBoard


Цитата:
File not found: 'AsyncCalls.dpu'
хде его взять?)

Тут http://andy.jgknet.de/blog/?page_id=100
Автор: Delta RuBoard
Дата сообщения: 10.12.2009 01:27
хм.. глупый скорее всего вопрос, но все же.. можно ли как то в мемо часть текста сделать жирным?) ну например как в html это делается с помощью тега <b>, ну или на форуме ббкод [b]

хм... с этим разобрался.. такое есть в RichEdit. вопрос теперь как сделать часть текста жирным

в частности интересует как сделать жирным add

Код: Memo1.Lines.Insert(0,add+' '+Copy(s,1,Pos(';',s)-1)+'> '+
Copy(s,Pos(';',s)+1,Length(s)-Pos(';',s)));
Автор: snike555
Дата сообщения: 10.12.2009 01:42
Delta RuBoard

В мемо нет, можно в RichEdit. Такие темы с RichEdit легко гуглятся.


Добавлено:
Delta RuBoard

Общая идея такая: выделяешь нужный текст и ему присваиваешь необходимые атрибуты
http://www.cyberforum.ru/delphi/thread42093.html
Автор: Delta RuBoard
Дата сообщения: 10.12.2009 06:09
всем спасибо, вроде бы как разобрался со всем, только почему то не хочет отправлять сообщение ни по Ентер, ни по Контрол+Ентер
Автор: greenpc
Дата сообщения: 10.12.2009 08:44
delover
посмотри на EurekaLog. может поможет.
имхо сам разработчик должен ловить свои баги.
Delta RuBoard

Цитата:
только почему то не хочет отправлять сообщение ни по Ентер, ни по Контрол+Ентер

и зачем этим хвастаться
1. ошибка в 17 строке
2. _http://www.bugtraq.ru/forum/faq/general/smart-questions.html
3. попробовать обработать onKeyDown
Автор: Aleksandr N
Дата сообщения: 10.12.2009 11:43
greenpc
Проверил. Как и следовало предпологать, пример с torry работает так-же - молча вырубает программу.

P.S. По совету модератора вечером вынесу своё собщение в отдельную тему. Ссылку добавлю.
Автор: greenpc
Дата сообщения: 10.12.2009 12:49
Aleksandr N
вот от меня _http://ifolder.ru/15401783
Автор: ZidanCo
Дата сообщения: 10.12.2009 16:33
Здравствуйте, начал изучать делфи , но пока совсем не разбираюсь , тут есть идея создать программу, где после нажатия на кнопку будет открываться окно с заранее заданным текстом (и картинками на случай).
Не подскажите как реализовать? Delphi 7
Автор: MartiN_X
Дата сообщения: 10.12.2009 16:42
ZidanCo
Если просто текст, то на кнопку вешаем MessageBox. А вот если с картинками, то наверное новую форуму надо создавать наверное. Я кстати тоже пока новичек в Делфи.
Автор: ZidanCo
Дата сообщения: 10.12.2009 17:17
Ну как бы , вот как я представляю это:
Есть некоторые категории информации, по нажатию на кнопку один(допустим) - появляется окно с описанием первой категории, причем оно должно быть фиксированным , с прокруткой вниз, так как теста прилично.
Это примерно.
А в идеале:
Список тем слева, при нажатии на кнопку первой темы , в этом же окне программы, просто правее текстовое поле(одно на все кнопки) , где в зависимости от выбранной темы , будет появляться нужная информация.

Попробовал MessageBox он позволяет не более 255 символов...
Автор: data man
Дата сообщения: 10.12.2009 18:25
ZidanCo

Способов это сделать - масса.
Как вариант.
Слева - ряд кнопок (допустим 10), у каждой в свойстве Tag значения от 1 до 10.
Справа - Memo.
Для всех этих кнопок один и тот же обработчик события ОнClick с таким кодом:

Код: var
S: string;
begin
case (Sender as TButton).Tag of
1: S := 'Это текст 1-ой темы';
... // тут аналогично
10: S := 'Это текст 10-ой темы';
else
S := 'Упс ! ';
end;
Memo.Text := S;
end;
Автор: delover
Дата сообщения: 10.12.2009 20:11
greenpc
Триальный период EurekaLog закончился. Хотя я переустановил систему, но не уверен что он будет работать. Зарубежные софтврайтеры его побаиваются. Приемуществ перед JCL я особых не успел увидеть. Он опционально не заточен под тупых юзеров как я. Кстати как переводится Эврека? Мне бы "лекарство", чтоб в стандартной поставке. На солько я понимаю, когда умирает процесс - умирает любой мутекс (если не служба). Когда умирает мютекс, любой поток может проснутся, даже самый юзерский. Дале дело возможности попросить систему не вернуть NEW IP в начальное положение.
Автор: Aleksandr N
Дата сообщения: 11.12.2009 17:34
greenpc
Вопрос вывел в тему:
http://forum.ru-board.com/topic.cgi?forum=33&topic=10825
Пока отвечу здесь.
По началу всё было более-менее прилично

Вот только при закрытии выдаёт

Кстати, на картинке видна и модель принтера, вот только ревизию драйвера сразу не вспомню - принтер рабочий, эксперименты ставлю в рабочие дни.
Автор: ppkp
Дата сообщения: 12.12.2009 18:21
Работаю с TStringGrid. Нужно Excel-подобное поведение в части drag'n'drop Selected. Т.е. при положении курсора мыши в углу Selected меняется курсор (но это не главное) и появляется возможность перетащить Selected в другое место(этой же StringGrid). Инет на поиск ничего вразумительного не нашел. Посоветуйте либо компонент, либо идею где и куда рыть. Спасибо.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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