- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一段用delphi编写的代码,当我在客户端计算机上打开exe文件时,它说索引列表超出范围(0),我搜索了整个谷歌,但无法修复,我必须如何修复它?有一些错误:D 感谢大家
代码:
unit UntMain;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Forms,
Graphics, ExtCtrls, Mask, Dialogs, Spin;
type
TfrmMain = class(TForm)
Panel1: TPanel;
PaintBox1: TPaintBox;
Button1: TButton;
Timer1: TTimer;
Edit1: TEdit;
SpinEdit1: TSpinEdit;
Button2: TButton;
procedure PaintBox1Paint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
Head: Boolean;
Body: Boolean;
RArm: Boolean;
LArm: Boolean;
LLeg: Boolean;
RLeg: Boolean;
WordStr:String;
SlashedWord: string;
Loaded: Boolean;
protected
Dictionary: TStringList;
procedure reset;
procedure HangMan;
function SolveWord(SlashedWord, WordStr: String; C: Char): String;
function isHanged: Boolean;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses UntHangman, UntAbout;
{$R *.dfm}
function TfrmMain.isHanged: Boolean;
begin
result:= (Head=True) AND (Body=True) AND (RARM=True) AND (LARM=true) AND (RLeg=True) AND (LLeg=true);
end;
procedure TfrmMain.HangMan;
begin
if not Head then begin Head:= true; PaintBox1.Invalidate; exit; end else
if not Body then begin Body:= true; PaintBox1.Invalidate; exit; end else
if not RArm then begin RArm:= true; PaintBox1.Invalidate; exit; end else
if not LArm then begin LArm:= true; PaintBox1.Invalidate; exit; end else
if not RLeg then begin RLeg:= true; PaintBox1.Invalidate; exit; end else
if not LLeg then begin LLeg:= true; PaintBox1.Invalidate; exit; end;
end;
function TfrmMain.SolveWord(SlashedWord, WordStr: String; C: Char): String;
var
idx: Integer;
begin
result:= SlashedWord;
for Idx := 1 to length(WordStr) do
begin
if upcase(WordStr[Idx]) = upcase(C) then
begin
result[Idx]:= C;
end;
end;
end;
procedure TfrmMain.Timer1Timer(Sender: TObject);
var
I: Integer;
begin
I:= SpinEdit1.Value;
if I <> 0 then
begin
I:= I-1;
SpinEdit1.Value:= SpinEdit1.Value -1;
end
else
begin
Timer1.Enabled:= False;
ShowMessage('You Lost!');
reset;
end;
end;
function SlashWord(Str: String): String;
var
I: Integer;
begin
for I := 1 to length(str) do
if Str[I] <> ' ' then
result:= result + '-'
else
result:= result + ' ';
end;
procedure TfrmMain.reset;
begin
Head:= False;
Body:= False;
LArm:= False;
RArm:= False;
LLeg:= False;
RLeg:= False;
paintBox1.Invalidate;
Edit1.Clear;
SpinEdit1.Value:= 30;
end;
procedure TfrmMain.Button1Click(Sender: TObject);
var
idx: Integer;
begin
idx:= random(Dictionary.Count);
WordStr:= Dictionary[Idx];
SlashedWord:= SlashWord(WordStr);
Edit1.Text:= SlashedWord;
Loaded:= True;
Timer1.Enabled:= True;
end;
procedure TfrmMain.Button2Click(Sender: TObject);
begin
frmAbout.ShowModal;
PaintBox1.Invalidate;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
self.KeyPreview:= True;
randomize;
Dictionary:= TStringList.Create;
if FileExists('Dictionary.dat') then
Dictionary.LoadFromFile('Dictionary.dat');
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
Dictionary.Free;
end;
procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
if loaded then
begin
if pos(upcase(Key), Uppercase(WordStr)) > 0 then
begin
SlashedWord:= SolveWord(SlashedWord, WordStr, Key);
Edit1.Text:= SlashedWord;
if Uppercase(SlashedWord) = UpperCase(WordStr) then
begin
Timer1.Enabled:= False;
ShowMessage('You Won!');
reset;
exit;
end;
end
else
begin
HangMan;
if isHanged then
begin
Timer1.Enabled:= False;
Edit1.Text:= WordStr;
ShowMessage('You Lost!');
reset;
exit;
end;
end;
end;
end;
procedure TfrmMain.PaintBox1Paint(Sender: TObject);
var
X,Y: Integer;
begin
inherited;
with PaintBox1 do
begin
Canvas.Pen.Color:= clBlack;
Canvas.Pen.Width:= 5;
Canvas.Pen.Style:= psSolid;
Canvas.Rectangle(1,1, ClientWidth-1, ClientHeight-1);
Canvas.Brush.Color:= clWhite;
Canvas.FloodFill(10,10,clBlack, fsBorder);
Canvas.MoveTo(ClientWidth div 2, 1);
Canvas.LineTo(Clientwidth div 2, ClientHeight Div 4);
X:= Clientwidth div 2; Y:= ClientHeight Div 4;
Canvas.Pen.Width:= 3;
if Head then
Canvas.Ellipse(X-25, Y-25, X+25, Y+25);
Y:= Y + 25;
Canvas.MoveTo(X, Y);
if Body then
Canvas.LineTo(X, Y + 100);
Canvas.MoveTo(X, Y + 25);
if LArm then
Canvas.LineTo(X-25, Y+50);
Canvas.MoveTo(X, Y + 25);
if RArm then
Canvas.LineTo(X+25, Y+50);
Canvas.MoveTo(X, Y + 100);
if LLeg then
Canvas.LineTo(X-25, Y+150);
Canvas.MoveTo(X, Y + 100);
if RLeg then
Canvas.LineTo(X+25, Y+150);
end;
end;
end.
最佳答案
List of index out of bound(0)
这意味着您尝试引用列表的索引 0,但索引 0 处没有元素。换句话说,您的列表为空。
我可以看到代码中唯一可能导致该错误的地方是您从 Dictionary
读取项目的位置。因此,我得出的结论是 Dictionary
是空的。您从中加载的文件不存在,或者该文件为空。
此时代码
if FileExists('Dictionary.dat') then
Dictionary.LoadFromFile('Dictionary.dat');
您需要做的不仅仅是默默地忽略丢失的文件。就我个人而言,我会删除对 FileExists 的检查,并尝试加载该文件,无论如何。如果加载失败,您的应用程序将引发异常。您还应该添加一个检查以确保字典不为空。
您的程序假定进程的工作目录与包含可执行文件的目录相同。情况可能并非总是如此。指定字典文件的完整路径,而不是使用相对路径(这对于 GUI 程序来说始终是一件脆弱的事情):
Dictionary.LoadFromFile(ExtractFilePath(Application.ExeName)+'Dictionary.dat');
您有多个 bool 值:
Head: Boolean;
Body: Boolean;
RArm: Boolean;
LArm: Boolean;
LLeg: Boolean;
RLeg: Boolean;
这些都应该替换为枚举类型:
type
TState = (stHealthy, stHead, stBody, ..., stDead);
或者类似的东西。声明一个字段 FState: TState
并初始化为 stHealthy
。每次用户猜错时,就写inc(FState)
。当你到达stDead
时,你就明白了。关键是状态有一个总顺序,所有这些 bool 值为您提供了比可能拥有的更大的灵 active 。它还会导致冗长且笨拙的代码。
关于delphi - 索引列表越界(0) Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575018/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!