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

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

Автор: psa1974
Дата сообщения: 04.12.2009 23:59
Aleksandr N
А так:

Код:
Const
OneKB = 1024;
OneMB = int64(OneKB* 1000);
DVDRom = int64(OneMB * 4700);
Автор: Aleksandr N
Дата сообщения: 05.12.2009 00:05
psa1974
Ну допустим DVDRom (я просто сократил ненужную информацию).
То-же самое...
Автор: data man
Дата сообщения: 05.12.2009 00:09

Цитата:
4700_DVDRom - это не прокатит!

Ага. А ещё и DVDRom получился средний

Цитата:
мегабайт бывает коротким, средним и длинным:
короткий — 1 000 000 байт
средний — 1 024 000 байт
длинный — 1 048 576 байт

http://ru.wikipedia.org/wiki/Мегабайт

Добавлено:

Цитата:
То-же самое...

На D2009 и D2010 компилируется без проблем

Код: {$APPTYPE CONSOLE}

const
OneKB = 1024;
OneMB = int64(OneKB * 1000);
DVDRom = int64(OneMB*4700);

begin
end.
Автор: Aleksandr N
Дата сообщения: 05.12.2009 00:11
data man
Мне без разницы длина Мб.
В данный момент на D7 не хочет...
Автор: psa1974
Дата сообщения: 05.12.2009 00:18
Aleksandr N

Цитата:
о-же самое...

Перед тем как написать ответ, я его проверил на Дельфи 2007.

Цитата:
В данный момент на D7 не хочет..

А почему бы сразу не указать версию компилятора?
Счас проверил на Дельфи 7. Без сучка и без задоринки. Аж обидно Может у тебя чё-то с настройками компилятора...

Добавлено:
data man
про средние мегабайты - прикольно
Автор: Aleksandr N
Дата сообщения: 05.12.2009 00:27
psa1974
Интересно! Вот только интересно почему у меня не срабатывает... Буду ковыряться...
А может ещё способ есть?
Автор: data man
Дата сообщения: 05.12.2009 00:33
Aleksandr N

Для начала dcc32 test.dpr, где test.dpr приведенное мною консольное приложение.
Если скомпилируется без ошибок (а ведь должно !) - копать в сторону опций проекта.
Автор: Aleksandr N
Дата сообщения: 05.12.2009 01:03
data man
Да, что-то в проекте не так. Только вот что - непонятно...
Автор: delover
Дата сообщения: 05.12.2009 11:47
Aleksandr N
Думаю копать надо в сторону типа Ordinal. Первоначально он соответствовал длине 32 бита и даже если Delphi 6 и понимала уже тип Int64, то всё одно преобразования этого типа с типом Variant не всегда работали. Ошибки были не математические а конверсионные исключения. Мне даже думается что в компиляторе Delphi 7 в бинаре, может быть используется та же математика. Константа в нашем случае это не типизированная переменная, а некоторая экспрессия которая должна вставлятся инлайном в те места где указано её имя в коде. Для пробы можно поэкспериментировать с написанием среднего мегобайта так:

const
DVDRom2: int64 = (OneMB*4700);

ps
Мои соболезнования по поводу Тихонова.

Добавлено:
у мну в D7 мегобайт компилируется и так и эдак.
Автор: Delta RuBoard
Дата сообщения: 05.12.2009 12:32
Frodo_Torbins

Цитата:
Delta RuBoard
То, что вы хотели повесить на кнопку, лучше впихнуть в отдельный поток.

это я в принципе то и хочу. я только не могу понять как =\
Автор: psa1974
Дата сообщения: 05.12.2009 13:31
delover
Хм... Странно, что у тебя const DVDRom2: int64 = (OneMB*4700); работает... У меня:

Код:
Const
OneKB = 1024;
OneMB = int64(OneKB* 1000);
DVDRom= int64(OneMB * 4700);
Автор: V1s1ter
Дата сообщения: 06.12.2009 00:30
psa1974

Цитата:
OneMB_ :int64 = (OneKB_* 1000);
DVDRom_:int64 = (OneMB_ * 4700); // [DCC Error] Unit8.pas(37): E2026 Constant expression expected

Потому, что OneMB_ на самом деле уже переменная.
Может помочь опция "присваиваемые типизованные кончтанты", выставляется в настройках проекта или директивой {$J+} / {$J-} или {$WRITEABLECONST ON} / {$WRITEABLECONST OFF}. Я не проверял, если интересно можешь посмотреть.
Автор: EugeneBoss3
Дата сообщения: 06.12.2009 00:50
Tantos

Цитата:
DoubleBuffered=true ?

Кому вопрос?
Автор: psa1974
Дата сообщения: 06.12.2009 02:42
V1s1ter

Цитата:
Потому, что OneMB_ на самом деле уже переменная

Мне это как раз очевидно, я просто удивлялся, как delover удалось это сделать.
А {$WRITEABLECONST ON}/{$WRITEABLECONST OFF} побоку, никакого эффекта в данном случае не оказывает.

Aleksandr N
Если так и не удалось заставить работать код, приведенный мной с самого начала, то как вариант можно описать глобальные переменные и инициировать их значениями в секции initialization.
Либо, если использовать Дельфи от 2005 и выше, можно описать соответствующие inline-функции...
Автор: V1s1ter
Дата сообщения: 06.12.2009 04:57
psa1974

Цитата:
Хм... Странно, что у тебя const DVDRom2: int64 = (OneMB*4700); работает... У меня:

Могу ошибаться, но тип результата определяется максимальным типом входящих в выражение операндов. Поэтому в Вашем примере последнюю строку запросто можно поменять на "DVDRom= OneMB * 4700;" и все прокомпилируется, поскольку в этом вырвжении OneMB уже имеет тип Int64.

Код:
const
OneKB = 1024;
OneMB = int64(OneKB* 1000);
DVDRom= int64(OneMB * 4700);
Автор: psa1974
Дата сообщения: 06.12.2009 05:59
V1s1ter

Цитата:
тип результата определяется максимальным типом входящих в выражение операндов

Действительно, так работает (но и первоначальный вариант ответа для Aleksandr N Ссылка у меня тоже работал, как и у всех остальных кроме самого Aleksandr N):

Цитата:
Const
OneKB = 1024;
OneMB = int64(OneKB* 1000);
DVDRom= OneMB * 4700;

а так - нет (поскольку OneMB_ - уже переменная):

Цитата:
Const
OneKB_ = 1024;
OneMB_ :int64 = (OneKB_* 1000);
DVDRom_ = OneMB_ * 4700; //[DCC Error] Unit8.pas(36): E2026 Constant expression expected

Все логично
Автор: Aleksandr N
Дата сообщения: 06.12.2009 16:49
psa1974

Цитата:
Const
OneKB = 1024;
OneMB = int64(OneKB* 1000);
DVDRom= OneMB * 4700;

А вот так действительно сработало, в торопях делал уставши...
Автор: Tantos
Дата сообщения: 07.12.2009 03:09
EugeneBoss3

Цитата:
Кому вопрос?

Тебе. Установка данного свойства для формы решит твою проблему?

Автор: EugeneBoss3
Дата сообщения: 07.12.2009 06:50
Tantos
Двойная буфферизация проблемы не решает.

Решил проблему следующим образом:
Нужно поместить нужный код до обращения к методу Application.Run.
[more=Пример реализации]
====================================================================
Пример реализации
====================================================================
program Initialize;

uses
Forms,
Windows,
MainFrm in 'MainFrm.pas' {frmMain},
AccessFrm in 'AccessFrm.pas' {frmAccess};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TfrmAccess, frmAccess);
// показать форму доступа
frmAccess.Show;
Application.Run;
end.

// форма доступа
unit AccessFrm;

interface

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

type
TfrmAccess = class(TForm)
ePassword: TEdit;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure ePasswordChange(Sender: TObject);
procedure ePasswordExit(Sender: TObject);

private
{ Private declarations }
sPassword, sUserName : string;
bAccess: Boolean;
function CheckUserAccess:Boolean;
public
{ Public declarations }
end;

var
frmAccess: TfrmAccess;

implementation

uses MainFrm;

{$R *.dfm}

procedure TfrmAccess.FormCreate(Sender: TObject);
begin
bAccess := False;
sUserName := 'User';
end;

procedure TfrmAccess.FormShow(Sender: TObject);
begin
sPassword:= Trim(ePassword.Text);
end;

procedure TfrmAccess.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//если набран необходимый пароль, то
if bAccess then
begin
//показать главное окно
frmMain.Show;
Exit //выйти из этой процедуры
end
else begin
// завершить программу
Application.Terminate;
Exit;
end;
end;

procedure TfrmAccess.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
// скрыть форму frmAccess
Hide;
// выполнить инициализацию доступа
if not( bAccess )
then MessageDlg('Извините!'+#10+
'У Вас нет прав доступа!'+#10+
'Программа будет закрыта!', mtWarning,[mbOk],0)
else begin
if (MessageDlg('Приветствую Вас '+#10+
sUserName+'!'+#10+
'Будем работать?',
mtConfirmation, [mbYes, mbNo], 0 ) = mrNo) then
begin
MessageDlg('Ваше право!'+#10+
'Программа будет закрыта!', mtWarning,[mbOk],0);
bAccess:= False;
end;
end;
end;
end;
end;

function TfrmAccess.CheckUserAccess:Boolean;
begin
Result := False;
if not (sPassword='') then
begin
if sPassword='Admin'
then Result := True
else Result := False;
end;
end;

procedure TfrmAccess.ePasswordChange(Sender: TObject);
begin
sPassword:= Trim(ePassword.Text);
CheckUserAccess;
end;

procedure TfrmAccess.ePasswordExit(Sender: TObject);
begin
sPassword:= Trim(ePassword.Text);
CheckUserAccess;
end;

end.
[/more]
Автор: psa1974
Дата сообщения: 07.12.2009 10:26
EugeneBoss3
Думаю, не ошибусь, если скажу, что все были бы рады, если бы ты скрывал такие длинные "излияния мыслей" под more или #. Если не затруднит Ибо твой пост длиной в пару экранов - это перебор.
Автор: SIgor33
Дата сообщения: 07.12.2009 12:22
Подскажите, пожалуйста, как отследить момент, когда в CD/DVD-ROM вставили диск? Если привода установлено 2,3... как заодно можно получить букву диска?
Автор: greenpc
Дата сообщения: 07.12.2009 14:20
SIgor33
так же как и момент вставки дискеты в флоппик, т.е никак.
а наличие диска рекомендуют проверять с помощью свободного места на диске
(GetDiskFreeSpace)
хотя _http://www.delphisources.ru/pages/faq/base/cd_insert_notify.html
Автор: Delta RuBoard
Дата сообщения: 07.12.2009 14:22
ребят, подскажите плиз как вот эти 2 куска кода

Код: repeat
//Ожидаем подключения.
vsocket := accept(vlistensocket,nil,nil);
//Клиент подключился, запускаем новый процесс на соединение.
createthread(nil,0,@socketthread,0,0,trid);
until false;
Автор: SIgor33
Дата сообщения: 07.12.2009 16:32
greenpc
Понял
Автор: snike555
Дата сообщения: 07.12.2009 17:05
Допустим есть объявление указателя вот такого

var
Form1 : TForm1;

Как от Form1 добиться TForm1 пока не создан объект?

Пробовал Form1.ClassName и Form1.ClassType, но пока объект не создан выдает AV.
Автор: psa1974
Дата сообщения: 07.12.2009 19:11
snike555
Ясное дело, что будет AV при вызове Form1.ClassName когда сам Form1 еще не существует, я бы на месте компилятора еще и цветасто выругался и по голове настучал...
ClassName - метод, объявленный как class function и может вызываться применительно к типу класса (когда сам класс еще не создан):

Код: TForm1.ClassName
Автор: snike555
Дата сообщения: 07.12.2009 20:32
psa1974

Цитата:
А вообще - это азбука. Учи матчасть. Возьми какой-нибудь учебник типа Дельфи для чайников... Пожалуйста, не стоит топик захламлять такими вопросами.


Поверь я не мало книжек прочитал по делфи и ответ не знаю, просто скажи ответ на мой вопрос без лишней воды, пожалуйста.
Автор: delover
Дата сообщения: 07.12.2009 20:47
snike555
Тута смотря чё Вы хочите от компьютера, то он Вам и будет показывать, чаще нам хочется AV. Имхо. Теперь по существу.
>Form1.ClassName
А что было перед этим оператором? Может быть Form1:=TForm1Predok84Potomok92.Create? И тогда какое имя хочется увидеть по правде? TForm1 или TForm1Predok84Potomok92?
Получается дилема - Form1 это переменная, говоря классическим языком. А мы хотим чтобы она была не переменной а телепатом. К сожалению компьютер максимум может подвиснуть. Если мы хотим узнать тип этой переменной, то можно написать
TForm1.ClassName.
Автор: psa1974
Дата сообщения: 07.12.2009 20:55
snike555
Именно ответ я тебе и дал перед тем как высказал пожелание насчет самообразования - читай внимательно:

TForm1.ClassName // буква Т в начале, я ее даже жирной сделал! Она говорит о том, что манипулировать надо с классом а не с переменной

ЗЫ: delover тебе дал точно такой же совет. Других вариантов определения имени класса без создания объекта не существует.

Добавлено
Книга Тейксейра, Пачеко: "Borland Delphi 6. Руководство разработчика", глава "Глава 2. Язык программирования Object Pascal", раздел "Использование объектов Delphi", подраздел "Базовый класс — TObject", цитата:

Цитата:
Бла-бла-бла...(приведено описание методов класса)... Обратите внимание на методы, объявление которых начинается со слова class. Это означает, что метод может быть вызван как обычная процедура или функция без создания экземпляра класса, членом которого является данный метод. Бла-бла-бла...

Книгу взял наугад.
Автор: snike555
Дата сообщения: 07.12.2009 21:22

Цитата:
TForm1.ClassName.


Где вы тут переменную увидели?(и я знаю что так можно), подчеркиваю, мне требуется класс от переменной до создания объекта.

Я задал конкретный вопрос, можно или нельзя, и если можно то как?

Когда объект создан в переменную, я согласен, что можно получить только то что там создали.
Я ведь объявляю переменную не как Form1 : TForm; и поэтому мне кажется логичным какой-то способ получения TForm1 из Form1, даже пока объект не создан. Если это невозможно то так и скажите.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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