Вверх ↑
Этот топик читают: Гость
Ответов: 4400
Рейтинг: 472
#346: 2016-04-09 16:59:32 ЛС | профиль | цитата
Есть вопрос к профи, схема с проблемным кодом code_37174.txt

Сильно только не смейтесь, гуглил муглил но так ни х.. не понял
карма: 4

0
файлы: 1code_37174.txt [967B] [200]
Ответов: 1841
Рейтинг: 362
#347: 2016-04-09 20:01:31 ЛС | профиль | цитата
andrestudio писал(а):
проблемным кодом

Тут требуется предварительное объявление типа как КЛАСС.
В плюсах это возможно проделать только с указателями.
Например так, но с заменой record на class (неявный ссылочный тип):
code_37175.txt
Со структурами без указателей скорее всего невозможно предварительно объявить тип как структуру...
карма: 1
1
файлы: 1code_37175.txt [439B] [172]
Голосовали:andrestudio
Ответов: 4400
Рейтинг: 472
#348: 2016-04-10 06:40:38 ЛС | профиль | цитата
CriDos, спасибо. И что получается, кроме как обернуть в класс и без вариантов


карма: 4

0
Ответов: 210
Рейтинг: 52
#349: 2016-04-10 07:18:39 ЛС | профиль | цитата
andrestudio,
вариант с record

type
PMyRecord = ^TMyRecord;

TMyProc1 = procedure (dt: PMyRecord ) of object;
TMyProc2 = procedure (dt: PMyRecord ) of object;

TMyRecord = record
i: integer;
s: string;
MyProc1: TMyProc1;
MyProc2: TMyProc1;
Chk: boolean;
end;
вариант 2

TMyRecord = record
i: integer;
s: string;
MyProc1: pointer;
MyProc2: pointer;
Chk: boolean;
end;
PMyRecord = ^TMyRecord;

TMyProc1 = procedure (var dt: TMyRecord ) of object;
TMyProc2 = procedure (var dt: TMyRecord ) of object;

и соответственно вызов: TMyProc2(MyRecord.MyProc2)(..arg..);
vs TMethod

TMyRecord = record
i: integer;
s: string;
MyProc1:TMethod;
MyProc2:TMethod;
Chk: boolean;
end;
PMyRecord = ^TMyRecord;

impl..

function my_proc(this : PMyRecord):string;
begin
this^.s:='dfdf';//прочие данные
result:=this^.s;//к примеру..
end;

//main

var
MyRecord:TMyRecord;

begin
MyRecord.s:='';
MyRecord.MyProc1:=MakeMethod(@ MyRecord ,@ my_proc);

//вызов
writeln(MyRecord.MyProc1);//<-- вызов и вывод результата "dfdf"


еще вариант TMyProc1 = procedure (var dt) of object;

и соответственно TMyRecord(dt).s:='ghghg';
карма: 1
слтв
1
файлы: 1code_37178.txt [267B] [158]
Голосовали:andrestudio
Ответов: 4400
Рейтинг: 472
#350: 2016-04-10 10:50:31 ЛС | профиль | цитата
Minkovsky, спасибо, но вариант с указателем мне известен, придётся видать переделать всё по фен-шую
------------ Дoбавленo в 10.50:
меня бы впрочем и TMethod в качестве TMyProc1 удовлетворил, но из за отсутствия в KOL RTTI про это можно забыть.
карма: 4

0
Ответов: 501
Рейтинг: 16
#351: 2016-07-26 09:25:58 ЛС | профиль | цитата
громко не смейтесь и не гоните в зашей я не мастер Delphi. уже несколько раз хотел так сказать портонуть элементы с Delphi в Hiasm но спотыкаюсь об Classes.pas .
Это все из за Kol? Кто то думал(пытался) отвязать Hiasm от Kol? Да скажете "размер программы и все компоненты на Kol, отвязать мягко говоря глупо" но без Kol перенос и написание компонентов станет легче в разы. Лично я готов пожертвовать размером exe-шника в пользу функциональности. Я отвязать не смогу но могу простенькие элементы отвязать.
карма: 1
        ]  
0
Ответов: 3943
Рейтинг: 622
#352: 2016-07-26 10:37:03 ЛС | профиль | цитата
Тут проблема не в размере, а в платности Delphi VCL. А если не VCL - то какая разница, что портировать, KOL, или с 0 всё писать или ещё что-то?
но спотыкаюсь об Classes.pas
Ничего сложного - выбрасываешь из требуемого кода Classes в uses и смотришь, на что ругается. В основном, всё что там используется есть в KOL (TList, TStringList, TStream). Остальное несложно дописать самому.
карма: 19

1
Голосовали:Tad
Ответов: 57
Рейтинг: 0
#353: 2016-09-04 13:23:59 ЛС | профиль | цитата
Всем привет!

Помогите вставить код правильно для определения температуры жёсткого диска :


Var
Ip: Array [0..$1F] of Byte =
($00,$02,$00,$00,$D0,$01,$01,$4F,$C2,$A0,$B0,$00,$00,
$00,$00,$00,$8C,$FD,$14,$00,$00,$02,$00,$00,$03,$00,
$00,$00,$03,$00,$00,$00);

Function GetHDDTemperarure(Nhdd: byte): String;
Type
TSmartData = Array [0..$20F] of Byte;
Var
Op: TSmartData;
H: Cardinal;
br: DWORD;
begin
H:= CreateFile(PChar('\\.\PhysicalDrive'+IntToStr(Nhdd)),$C0000000,3,nil, 3,0,0);
DeviceIoControl(H,$0007C088,@Ip,$20,@Op,$210,br,nil);
CloseHandle(H);
Result:= IntToStr(Op[$A8]*$FF+Op[$A7]);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:= 'Температура: '+GetHDDTemperarure(0)+' C^';
end;
карма: 0

0
Ответов: 3943
Рейтинг: 622
#354: 2016-09-05 14:46:01 ЛС | профиль | цитата
Выдаёт что-то непонятное:


Add(MainForm,2953706,21,105)
{
Position=1
}
Add(Button,10504036,217,203)
{
Left=135
Top=5
Caption="Get temp"
link(onClick,11970995:doGetTemp,[])
}
Add(InlineCode,11970995,287,203)
{
WorkPoints=#9:doGetTemp|
EventPoints=#8:onResult|
DataPoints=#8:HDDIndex|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|28: Windows, KOL, Share, Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|0:|10: public|26: HDDIndex: THI_Event;|29: onResult: THI_Event; |57: procedure doGetTemp(var _Data: TData; Index: Word);|6: end;|0:|14:implementation|0:|3:var|30: Ip: array [0..$1F] of Byte =|55: ($00,$02,$00,$00,$D0,$01,$01,$4F,$C2,$A0,$B0,$00,$00,|55: $00,$00,$00,$8C,$FD,$14,$00,$00,$02,$00,$00,$03,$00,|28: $00,$00,$03,$00,$00,$00);|1: |48:function GetHDDTemperarure(Nhdd: Byte): Integer;|4:type|39: TSmartData = array [0..$20F] of Byte;|3:var|16: Op: TSmartData;|12: H: THandle;|11: br: DWORD;|5:begin|89: H := CreateFile(PChar('\\.\PhysicalDrive' + Int2Str(Nhdd)), $C0000000, 3, nil, 3, 0, 0);|15: if H <> 0 then|6: begin|63: DeviceIoControl(H, $0007C088, @Ip, $20, @Op, $210, br, nil);|18: CloseHandle(H);|37: Result := Op[$A8] * $FF + Op[$A7];|4: end|5: else|15: Result := 0;|4:end;|0:|0:|63:procedure THiAsmClass.doGetTemp(var _Data: TData; Index: Word);|3:var|13: I: Integer;|5:begin|39: I := ReadInteger(_Data, HDDIndex, 0);|58: _hi_CreateEvent(_Data, @onResult, GetHDDTemperarure(I));|4:end;|0:|0:|4:end.|
link(onResult,10659795:doText,[])
link(HDDIndex,15129361:Text,[])
}
Add(Edit,15129361,287,154)
{
Left=75
Top=5
Text="0"
}
Add(Label,10659795,357,203)
{
Left=200
Top=10
Width=11
Height=17
Caption="T"
}
Add(Label,11901701,21,154)
{
Left=20
Top=10
Width=54
Height=17
Caption="HDD num:"
}
карма: 19

0
Ответов: 8351
Рейтинг: 775
#355: 2016-09-05 16:26:53 ЛС | профиль | цитата
Netspirit, а ваш код выдаёт всё понятное, жаль градусы Integer
ТемператураДиска.jpg
карма: 14

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#356: 2016-09-05 16:55:30 ЛС | профиль | цитата
Леонид писал(а):
а ваш код выдаёт всё понятное, жаль градусы Integer

У Tad-a переняли выкладывать рисунки, а не схемы?
карма: 19

0
Ответов: 57
Рейтинг: 0
#357: 2016-09-05 17:07:07 ЛС | профиль | цитата
без таймера ноль выдаёт а с таймером 255 , вот ещё вариант с делфи форума :

procedure GetTemperature(var Airflow, HDA, Temperature: Integer);
var
objLocator: ISWbemLocator;
objServices: ISWbemServices;
objObjectSet: ISWbemObjectSet;
EnumSet: IEnumVariant;
SetVar: OleVariant;
Fetched: Cardinal;
objObject: ISWbemObject;
objProperty: ISWbemProperty;
v: OleVariant;
i: Integer;
begin
Airflow:=-1;
HDA:=-1;
Temperature:=-1;
objLocator:=CreateComObject(CLASS_SWbemLocator) as ISWbemLocator;
objServices:=objLocator.ConnectServer('', 'root\WMI', '', '', '', '', 0, nil);
objObjectSet:=objServices.ExecQuery('select * from MSStorageDriver_ATAPISmartData', 'WQL', 0, nil);
EnumSet:=IUnknown(objObjectSet._NewEnum) as IEnumVariant;
while EnumSet.Next(1, SetVar, Fetched)=S_OK do
begin
objObject:=IUnknown(SetVar) as ISWbemObject;
objProperty:=objObject.Properties_.Item('VendorSpecific', 0);
if (objProperty.CIMType=wbemCimtypeUint8) and objProperty.IsArray then
begin
v:=objProperty.Get_Value;
for i:=0 to ((VarArrayHighBound(v, 1)-1) div 12)-1 do
begin
if v[2+i*12]=190 then Airflow:=v[2+i*12+3];
if v[2+i*12]=194 then HDA:=v[2+i*12+3];
if v[2+i*12]=231 then Temperature:=v[2+i*12+3];
end;
end;
end;
end;
только нужно исправить код для нескольких жестких дисков, иначе будет выдавать для последнего.
карма: 0

0
Ответов: 8351
Рейтинг: 775
#358: 2016-09-06 09:18:26 ЛС | профиль | цитата
nesco, схема от Netspirit-а постом выше
карма: 14

0
Разработчик
Ответов: 25463
Рейтинг: 2071
#359: 2016-09-06 09:27:40 ЛС | профиль | цитата
Леонид писал(а):
схема от Netspirit-а постом выше

Да ладно, в его схеме нет графика
карма: 19

0
Ответов: 8351
Рейтинг: 775
#360: 2016-09-06 10:32:56 ЛС | профиль | цитата
nesco писал(а):
в его схеме нет графика

И таймера тоже нет, и суслика не видно
карма: 14

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)