一个简单的图像模式切换utility问题(200分)

  • 主题发起人 主题发起人 achang
  • 开始时间 开始时间
A

achang

Unregistered / Unconfirmed
GUEST, unregistred user!
请问有什么好的方法可以存储系统所支持的所有支持的显示模式(这个我可以用EnumDisplaySettings循环得到),并且我希望分别按照分辨率/位色深/以及刷新率 排序。

例如:我想做一个动态菜单,菜单的内容是按照分辨率(1级菜单)排序,之后是位色深( 2级),之后是刷新率(3级)。 如何才能将得到的数据排好序然后将之加入菜单项。

附上取得模式列表的格式:
1.640x480 16 Colors @60Hz
102.320x200 16 Colors @60Hz
103.320x200 16 Colors @70Hz
104.320x200 16 Colors @72Hz
105.320x200 16 Colors @75Hz
106.320x240 16 Colors @60Hz
107.320x240 16 Colors @70Hz
108.320x240 16 Colors @72Hz
109.320x240 16 Colors @75Hz
110.400x300 16 Colors @60Hz
111.400x300 16 Colors @70Hz
112.400x300 16 Colors @72Hz
113.400x300 16 Colors @75Hz
114.480x360 16 Colors @60Hz
115.480x360 16 Colors @70Hz
116.480x360 16 Colors @72Hz
117.480x360 16 Colors @75Hz
118.512x384 16 Colors @60Hz
119.512x384 16 Colors @70Hz
120.512x384 16 Colors @72Hz
121.512x384 16 Colors @75Hz
122.640x400 16 Colors @60Hz
123.640x400 16 Colors @70Hz
124.640x400 16 Colors @72Hz
125.640x400 16 Colors @75Hz
127.640x480 16 Colors @70Hz
128.640x480 16 Colors @72Hz
129.640x480 16 Colors @75Hz
130.640x480 16 Colors @85Hz
131.640x480 16 Colors @100Hz
132.720x480 16 Colors @60Hz
133.720x576 16 Colors @60Hz
134.800x600 16 Colors @60Hz
135.800x600 16 Colors @70Hz
136.800x600 16 Colors @72Hz
137.800x600 16 Colors @75Hz
138.800x600 16 Colors @85Hz
139.800x600 16 Colors @100Hz
140.848x480 16 Colors @60Hz
141.848x480 16 Colors @70Hz
142.848x480 16 Colors @72Hz
143.848x480 16 Colors @75Hz
144.848x480 16 Colors @85Hz
145.848x480 16 Colors @100Hz
146.960x600 16 Colors @60Hz
147.960x600 16 Colors @70Hz
148.960x600 16 Colors @72Hz
149.960x600 16 Colors @75Hz
150.960x600 16 Colors @85Hz
151.960x600 16 Colors @100Hz
152.1024x768 16 Colors @60Hz
153.1024x768 16 Colors @70Hz
154.1024x768 16 Colors @72Hz
155.1024x768 16 Colors @75Hz
156.1024x768 16 Colors @85Hz
157.1088x612 16 Colors @60Hz
158.1088x612 16 Colors @70Hz
159.1088x612 16 Colors @72Hz
160.1088x612 16 Colors @75Hz
161.1088x612 16 Colors @85Hz
162.1152x864 16 Colors @60Hz
163.1152x864 16 Colors @70Hz
164.1152x864 16 Colors @72Hz
165.1152x864 16 Colors @75Hz
166.1152x864 16 Colors @85Hz
167.1280x720 16 Colors @60Hz
168.1280x720 16 Colors @70Hz
169.1280x720 16 Colors @72Hz
170.1280x720 16 Colors @75Hz
171.1280x720 16 Colors @85Hz
172.1280x768 16 Colors @60Hz
173.1280x768 16 Colors @70Hz
174.1280x768 16 Colors @72Hz
175.1280x768 16 Colors @75Hz
176.1280x768 16 Colors @85Hz
177.1280x800 16 Colors @60Hz
178.1280x800 16 Colors @70Hz
179.1280x800 16 Colors @72Hz
180.1280x800 16 Colors @75Hz
181.1280x800 16 Colors @85Hz
182.1280x960 16 Colors @60Hz
183.1280x960 16 Colors @70Hz
184.1280x960 16 Colors @72Hz
185.1280x960 16 Colors @75Hz
186.1280x960 16 Colors @85Hz
187.1280x1024 16 Colors @60Hz
188.1280x1024 16 Colors @70Hz
189.1280x1024 16 Colors @72Hz
190.1280x1024 16 Colors @75Hz
191.1360x768 16 Colors @60Hz
192.1360x768 16 Colors @70Hz
193.1360x768 16 Colors @72Hz
194.1360x768 16 Colors @75Hz
195.1600x900 16 Colors @60Hz
196.1600x900 16 Colors @70Hz
197.1600x900 16 Colors @72Hz
198.1600x900 16 Colors @75Hz
199.1600x1024 16 Colors @60Hz
200.1600x1024 16 Colors @70Hz
201.1600x1024 16 Colors @72Hz
202.1600x1024 16 Colors @75Hz
203.1600x1200 16 Colors @60Hz
309.248x248 16 Colors @60Hz
310.640x480 16 Colors @68Hz
311.800x600 16 Colors @68Hz


xiexie!!
 
使用TreeView1存储吧,可以分级存储。载入也方便。
 
直接排序比较不现实,建议分拆成个体信息进行排序或者分类:
我写了几个方法,只要调用就可以了:
1.将你的列表转换成TShowModeArray,可以调用StrToShowMode函数
2.比如你要生成TreeView,那么第一:调用:GetShowPixelList,
3.针对每个ShowPixel,调用GetColorDeepList
4.针对每个ShowPixel和ColorDeep,调用GetFreqList

/////////////////////////////////////////////
Type
TShowMode = record
ShowPixel: string;
ColorDeep: Integer;
Freq: string;
end;

TShowModeArray = array of TShowMode;
// 310.640x480 16 Colors @68Hz
function StrToShowMode(S: string): TShowMode;
var
nDotPos, nSpacePos1, nSpacePos2, nPos: Integer;
begin
S := StringReplace(S, ' ', '', [rfReplaceAll]);
with Result do
begin
nDotPos := AnsiPos('.', S);
nSpacePos1 := AnsiPos(' ', S);
nSpacePos2 := PosEx(' ', S, nSpacePos1 + 1);
nPos := AnsiPos('@', S);
ShowPixel := Copy(S, nDotPos + 1, nSpacePos1 - nDotPos - 1);
ColorDeep := StrToInt(Copy(S, nSpacePos1 + 1, nSpacePos2 - nSpacePos1 - 1));
Freq := Copy(S, nPos + 1, MaxInt);
end;
end;

procedure GetShowPixelList(AItems: TShowModeArray; AList: TStringList);
var
I: Integer;
begin
for I := 0 to Length(AItems) - 1 do
begin
if AList.IndexOf(AItems.ShowPixel) = -1 then
AList.Add(AItems.ShowPixel);
end;
AList.Sort;
end;

procedure GetColorDeepList(AItems: TShowModeArray; AShowPixel: string; AList: TStringList);
var
I: Integer;
begin
for I := 0 to Length(AItems) - 1 do
begin
if SameText(AItems.ShowPixel, AShowPixel) then
begin
if AList.IndexOf(AItems.ShowPixel) = -1 then
AList.Add(IntToStr(AItems.ColorDeep));
end;
end;
AList.Sort;
end;

procedure GetFreqList(AItems: TShowModeArray;
AShowPixel: string; AColorDeep: Integer; AList: TStringList);
var
I: Integer;
begin
for I := 0 to Length(AItems) - 1 do
begin
if SameText(AItems.ShowPixel, AShowPixel) and
(AItems.ColorDeep = AColorDeep) then
begin
if AList.IndexOf(AItems.ShowPixel) = -1 then
AList.Add(AItems.Freq);
end;
end;
AList.Sort;
end;
 
首先,我想我要确定一共有几种唯一的分辨率,并且把他们作为根。这一步怎么做法?
能给代码的最好,不能给的说下算法。
^^
 
多人接受答案了。
 
后退
顶部