Delphi 位域的解決辦法

2021-09-08 07:17:26 字數 1586 閱讀 5475

記得以前在將c++的標頭檔案時候在結構體中有個成員是位域定義,說白了就是將乙個位元組中的每一位代表什麼意思,比如第3位如果為1的話代表代表資料有效,反之為0就是資料無效.

當時沒有辦法就直接定義乙個位元組吧,在使用的時候先讀出這個位元組然後用與運算來判斷吧.

最近困在襄樊和河南的乙個交界處,偏僻呀,不過也好,沒事幹的時候可以看看**吧.

其實在很早之前看jedi中翻譯的pas檔案時候就看到過用set來表示位域的,當時沒有怎麼在意,今天在看objauto單元的時候,測試的時候有點兒新的發現:

//引數的傳值方式

//tparamflag = (pfvar, pfconst, pfarray, pfaddress, pfreference, pfout,

pfresult);

tparamflags = set of tparamflag;

這是集合定義部分.然後我們看看我們的**吧.

procedure tform3.btn1click(sender: tobject);

var p: tparamflags;

begin

p:=[pfreference];

p:=[pfvar, pfconst, pfarray, pfaddress, pfreference, pfout,

pfresult];

end;

如果我們用ord(pfvar)只能得到0,而且delphi的提示裡面也是顯示的0.但是這裡是用括起來的.那麼值有沒有變化呢?

我們看見eax是$10也就是00010000,這就是[pfreference]的值.光pfreference是他是4,但是用到集合後他就變成了二進位制的第五位是1也就是16.

也就是在集合中,每乙個元素佔一位,元素與元素之間用or連線起來組成乙個數.

那麼乙個集合會有多大呢?其實和它有多少個元素有關係,大小應該整除8 + 1吧.看例子:

在上面的例子中加一句

showmessage(inttostr(sizeof(p)));
結果是1,因為tparamflag 中只有7個元素.

那麼我們自己定義乙個元素多一點兒的集合來看看吧,

type

ttest = (t1,t2,t3,t4,t5,t6,t7,t8,t9);

ttests = set of ttest;

procedure tform3.btn4click(sender: tobject);

var t:ttests;

begin

showmessage(inttostr(sizeof(t)));

end;

現在結果就是2了.

說了這麼多,最後就是在結構體或者其他時候要判斷某一位是否為一我們只需要

if t1 in t then
如果是true那麼第0位就是1了.

好了要說的就是這麼多了.

跨域解決辦法

解決跨域 本文通過設定access control allow origin來實現跨域。例如 客戶端的網域名稱是client.runoob.com,而請求的網域名稱是server.runoob.com。如果直接使用ajax訪問,會有以下錯誤 no access control allow origi...

跨域解決辦法

什麼是跨域 協議 主網域名稱 子網域名稱 埠有乙個不相同即跨域。如 在www.test.com 請求 www.abc.com下的介面 主網域名稱不同 在www.test.com 請求 m.test.com下的介面 主網域名稱不同 在www.test.com 請求 www.test.com 81下的介...

spring boot跨域解決辦法

專案中經常會遇到前後端分離的情況,分離之後會碰到跨域問題,前端無法訪問後端的介面。可以通過如下3種方式解決跨域問題。public class corsfilter implements filter override public void dofilter servletrequest servl...