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

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

Автор: InSe0F
Дата сообщения: 30.01.2010 21:37
сделал через сокеты вроде разобрался.. хочу в поток засунуть как правильней сделать - чтобы потоки не дублировались?
- у меня таймер - когда срабатывает создается поток обработки через класс TThread.Create() - что будет когда таймер сработает второй раз? для безоспасности надо делать Free или дестрой?
Автор: EugeneBoss3
Дата сообщения: 01.02.2010 04:03
VadimLou
Фиксу применил, теперь ошибка при открытии не вылетает.
Вопрос по созданию (использованию индекса в VkDbf), компонент создает или поддерживает какие-либо индексы (но умолчанию должен поддерживать Clipper'овские)? Попытки подключить имеющиеся или создать новые безуспешны! В чем может быть причина?
Автор: mistie
Дата сообщения: 01.02.2010 08:34
Что-то невероятное творится. Создаем новый проект VCL Forms в дельфях:


Код:
unit Unit2;

interface
[more]
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type

TTimerThread=class(TThread)
private
F_Timer:TTimer;
public
constructor Create; reintroduce;
destructor Destroy; override;
procedure Execute; override;
end;

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

var
Form2: TForm2;

implementation

{$R *.dfm}

{ TTimerThread }

constructor TTimerThread.Create;
begin
inherited Create(false);
F_Timer:=TTimer.Create(nil);
FreeOnTerminate:=true;
end;

destructor TTimerThread.Destroy;
begin
try
FreeAndNil(F_Timer);
inherited;
except on e:exception do
showmessage(e.message);

end;
end;

procedure TTimerThread.Execute;
begin
while not Terminated do
sleep(1);

end;

procedure TForm2.Button1Click(Sender: TObject);
begin
testThread.Terminate;
testThread:=nil;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
testThread:=TTimerThread.Create;
end;

end.
[/more]
Автор: psa1974
Дата сообщения: 01.02.2010 09:16
mistie
Почему каждого надо тыкать носом в шапку??? Приведи свой пост в соответствие. Это во-первых.

Во-вторых - кто тебе сказал, что во вторичных потоках можно использовать компоненты VCL? VCL - принципиально однопоточная библиотека, компоненты VCL допустимо использовать ТОЛЬКО в основном потоке. И TTimer - не исключение, поскольку он использует для своей работы невидимое окно для получения сообщений WM_TIMER и если в создавшем потоке отсутствует петля сообщений (а в TThread она отсутствует в принципе), то TTimer оказывается в лучшем случае неработоспособен. В худшем - как у тебя.
Автор: mistie
Дата сообщения: 01.02.2010 10:12

Цитата:
Почему каждого надо тыкать носом в шапку??? Приведи свой пост в соответствие. Это во-первых.


Спасибо, привел.


Цитата:

Во-вторых - кто тебе сказал, что во вторичных потоках можно использовать компоненты VCL? VCL - принципиально однопоточная библиотека, компоненты VCL допустимо использовать ТОЛЬКО в основном потоке. И TTimer - не исключение, поскольку он использует для своей работы невидимое окно для получения сообщений WM_TIMER и если в создавшем потоке отсутствует петля сообщений (а в TThread она отсутствует в принципе), то TTimer оказывается в лучшем случае неработоспособен. В худшем - как у тебя.


Во-первых, таймер создается в конструкторе вторичного потока, который вызывается в контексте основного. По правилу "Дома, который построил Джек", таймер так же будет создан в контексте основного - я же не пихаю это в Execute. Пожалуйста, будьте внимательны. Во-вторых, он вполне работоспособен, вне зависимости от способа завершения потока - вручную или через FreeOnTerminate. Единственная разница в том, что если завершать через FreeOnTerminate, то наблюдается вот такая фигня. Причем, вновь замечу, в деструкторе исключений не вылетает, вылетает AV ТОЛЬКО при переключении между окном приложения и другими.

И так, на всякий случай: вопрос мой звучит как "почему так происходит?" а не "как сделать по-другому?".
Автор: Man Without Face
Дата сообщения: 01.02.2010 14:46
Нужно перевести число из 16-ной в десятичную, например: 0xF (255 вроде как, в десятичной). Использую функцию strtoint:
cxCurrencyEdit1.value := strtoint('0xF');
Получаю 15 а не 255. Может как то можно по другому это реализовать?
BDS 2006 + DevExpress v48.
Заранее благодарен.

Добавлено:
Сори, затупил: 0xF это 15, в датасете поле макс 3 знака, поэтому 4й символ обрезает.
Автор: akaGM
Дата сообщения: 01.02.2010 15:38
Man Without Face

cxCurrencyEdit1.value := strtoint('$FF');
Автор: Man Without Face
Дата сообщения: 01.02.2010 15:58
Подскажите пож как скрыть программу, чтобы не видно было по alt-tab?
Этот код в XP не работает:
var
ExtendedStyle : integer;
begin
Application.Initialize;
ExtendedStyle:=GetWindowLong(application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
ExtendedStyle or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Заранее благодарен.
Автор: delover
Дата сообщения: 01.02.2010 21:23
Man Without Face
Раньше работало, может
Application.Title := '';
?

Добавлено:
Man Without Face
Да и забыл спосить
ShowMainForm = True
?
Автор: Man Without Face
Дата сообщения: 02.02.2010 08:34
delover
Спасибо конечно, но это все не катит...
Автор: psa1974
Дата сообщения: 02.02.2010 09:52
Man Without Face

Цитата:
Подскажите пож как скрыть программу, чтобы не видно было по alt-tab?

Попробуй файл проекта *.dpr переписать так: [more=ПРИМЕР]
program Project1;

uses
Windows, Forms, SysUtils,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

procedure DoneApplication;
begin
with Application do
begin
if (Handle <> 0) then
ShowOwnedPopups(Handle, False);
ShowHint:= False;
Destroying;
DestroyComponents;
end;
end;

begin
Application.Initialize;

Form1:= TForm1.Create(Application);
{при таком способе создания формы не запускается механизм создания главной формы, а поскольку главной формы нет, в методе Application.Run не запускается цикл приема и выборки сообщений из очереди сообщений, поэтому петлю сообщений придется реализовать самому}

ShowWindow(Application.Handle, SW_HIDE);

AddExitProc(DoneApplication);

// петля сообщений:
repeat
Application.HandleMessage;
until Application.Terminated;
end.
[/more]
Автор: Vo1T
Дата сообщения: 02.02.2010 21:02
Господа хорошие, объясните почему программа считает неверно
[more=Код]
Код: procedure TForm1.Button1Click(Sender: TObject);
var
K, S, G, X, Integ : Double;
N, I , A, B : Integer;
begin
Randomize;
A := StrToInt(EditA.Text); // = 1
B := StrToInt(EditB.Text); // = 2
N := StrToInt(EditN.Text); // = 10
S := 0;
K := B - A;
for I := 1 to N do
begin
G := Random;
Label7.Caption := FloatToStr(G); // Без этой строчки считает неверно
Repaint;
X := A + G * (B - A);
S := S + (1 + X);
Sleep(5);
end;
Integ := (1/N)*K*S;
Label5.Caption := FloatToStr(Integ);
end;
Автор: erdeuz
Дата сообщения: 03.02.2010 13:36
Есть программа которая использует БД paradox через BDE, с недавних пор начала тормозить при работе нескольких пользователей, причем у первого кто запустил программа работает нормально, у второго тормозит, у следуещего еще сильнее томозит и т.д, у первого же пользователя продолжает работать нормально %-|
База данных находится на сетевом диске. Заметил, что когда ничего не запущено, файлы с БД быстро копируются, стоит запустить программу, при копировании начинаются задержки. С того же сервера "консультант" работает без задержек.

Есть идеи, что могло послужить причиной???
Автор: snike555
Дата сообщения: 03.02.2010 15:55
erdeuz
А не было мысли мол если базой пользуются несколько человек одновременно, то перейти на СУБД посеръезднее?
Автор: V1s1ter
Дата сообщения: 03.02.2010 16:05
erdeuz
Саму программу менял, в смысле компилил и т.п. или "ничего не трогал, а оно..."
snike555
Я думаю, если бы об этом были мысли, то человек и спросиб бы по другому.
Я переводил проект однажды и не смотря на наличие исходников и либеральность AbsolutDatabase не могу сказать, что это были мои лучшие дни...
Автор: akaGM
Дата сообщения: 03.02.2010 16:29
Vo1T

Код: procedure TForm1.Button1Click(Sender: TObject);
begin
...
Randomize;
G := Random;
...
end;
Автор: Umbrall
Дата сообщения: 05.02.2010 01:24
возникла небольшая проблема при использование объекта Char. Мне нужно построить график который замкнутой линии, проблема возникает при нарисовки его вся фигура закрашивается. как можно сделать что бы график строился по точкам с той последовательностью что я и задавал?
Автор: psa1974
Дата сообщения: 05.02.2010 03:14
Umbrall
Приведи свой способ решения, при котором возникает проблема, потому что не совсем понятно что имеется ввиду, когда ты сказал "при использовании объекта Char" и как это связано с рисованием графика...
Автор: data man
Дата сообщения: 05.02.2010 03:31
psa1974

Цитата:
что имеется ввиду

Скорее всего TChart.

Umbrall
И да, лучше привести свой код или вопрос сформулировать как-то почётче.
Автор: VadimLou
Дата сообщения: 05.02.2010 07:55
EugeneBoss3

Цитата:
vkDBF индексы

с индексами не разбирался ... там вроде примеры какие-то были - мож чё по индексам и есть ...
Я свои фиксы скинул автору ... попробуй у него поспрошать ...

Добавлено:
Man Without Face

Цитата:
все не катит...

А ты св-во Visible вырубил на своей форме ?

--
program ...

begin
...
Application.ShowMainForm := False;
ShowWindow(Application.Handle, SW_HIDE);
...CreateForm(...
...
Автор: Umbrall
Дата сообщения: 06.02.2010 17:32
извините что ввел в заблуждение
вот пример проблемы, точки графика и их порядок указаны слева, справа то как он решил нарисовать его

вот процедура которая вносит точки

Код: procedure TForm1.GridPointSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
var i:integer;
begin
GridPoint.Cells[0,ARow]:=inttostr(ARow-1);
if (GridPoint.RowCount=(ARow+1)) then GridPoint.RowCount:=GridPoint.RowCount+1;
if ARow>Size then Size:=ARow;
SetLength(X,Size);
if ((Value<>'-') and (Value<>'') and (Value<>' '))
then X[ARow-1,ACol]:=strtofloat(Value);
Series2.Clear;
Series4.Clear;
for i:=0 to Size-1 do Series2.AddXY(X[i,1],X[i,2]);
for i:=0 to Size-1 do Series4.AddXY(X[i,1],X[i,2]);
end;
Автор: snike555
Дата сообщения: 06.02.2010 22:47
Umbrall
А обязательно TChart использовать? Проще в таком случае самому через TCanvas.
Автор: Umbrall
Дата сообщения: 07.02.2010 00:35
хотелось что бы все отображалось красиво
Автор: psa1974
Дата сообщения: 07.02.2010 06:54
Umbrall
Для того чтобы точки рисовались в требуемой последовательности укажи для каждой серии перед добавлением точек порядок сортировки по осям:
Код: Series2.XValues.Order:= loNone;
Series2.YValues.Order:= loNone;
Автор: Umbrall
Дата сообщения: 07.02.2010 12:20
psa1974 большое спасибо, это как раз то чего не хватало
Автор: itheposter
Дата сообщения: 10.02.2010 13:46
Подскажите плиз:

Есть строка с текстом: '14:35 3.11.2009'

Нужно перевести её в формат TDateTime сравнить с текущей датой, временем и выдать разницу в минутах.

Не могу никак правильно применить StrToDateTime. Подскажите как правильно перевести исходную строку в TDateTime?


Автор: akaGM
Дата сообщения: 10.02.2010 14:18
itheposter
StrToDateTime
в самом названии п/п указан порядок -- сначала Дата, потом Тайм
сначала преобразуй своё '14:35 3.11.2009' в '3.11.2009 14:35', потом уже зови StrToDateTime()
и не забудь про локаль DataSeparator точка или слеш и порядок месяц/число
Автор: greenpc
Дата сообщения: 10.02.2010 15:27
itheposter
как-то так

Код:
const
sDate ='14:35 3.11.2009';
var
mydate, mdelta : tdatetime;
lHour, lMin, lSec, lMSec: Word;
begin
mydate := strtodate(copy(sDate, pos(' ', sDate), length(sDate)))+
strtoTime(copy(sDate, 1, pos(' ', sDate)-1));
mdelta :=Now-mydate;
DecodeTime(mdelta ,lHour, lMin, lSec, lMSec);
showmessage( inttostr(Trunc(mdelta)*24*60+lHour*60+lMin));
end;
Автор: Odysseos
Дата сообщения: 10.02.2010 16:58
itheposter

Если локаль русская, а формат даты+времени всегда именно такой (пять символов времени - пробел - дата) - то все просто:


Код:
var
s_dt: String;
dt: TDateTime;
begin
Readln(s_dt);

dt := StrToDateTime(Copy(s_dt, 7, Length(s_dt) - 6) + ' ' + Copy(s_dt, 1, 5));

Writeln(Trunc(Frac(Now() - dt) * 24 * 60));
end;
Автор: akaGM
Дата сообщения: 10.02.2010 18:06
средствами дельфей можно самому динамически выставить нужный формат даты/времени, плюя на локаль, считать, восстановить:

Код: uses SysUtils;
var
saveDate, saveTime: string;
begin
//сохраняем
saveDate := ShortDateFormat;
saveTime := LongTimeFormat;

//выставляем нужный
ShortDateFormat := 'DD-MM-YYYY';
LongTimeFormat := 'hh:mm:ss';

{
// или любой удобный
ShortDateFormat := 'YYYYMMDD'; // 'DD/MM/YYYY' 'MM/DD/YYYY';;
LongTimeFormat := 'hhmmss';
}

//считываем/работаем
...
//

//восстанавливаем
LongTimeFormat := saveTime;
ShortDateFormat := saveDate;
end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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