Lazarus: Wie selektiere ich ein Formular?

Quelltext1 - (Schule, programmieren, Informatik) Quelltext2 - (Schule, programmieren, Informatik) Quelltext3 - (Schule, programmieren, Informatik) Quelltext4 - (Schule, programmieren, Informatik) Quelltext5 - (Schule, programmieren, Informatik) Bei einem Windpark - (Schule, programmieren, Informatik) Beim zweiten Windpark  - (Schule, programmieren, Informatik)

1 Antwort

Wie meinst du "selektieren"?

Allgemein mit FormularName.setfocus damit es für Eingaben bereit ist.

Wenn du darauf malen willst, machst du das direkt mit der Variablen - du hast ja offenbar ein Object erstellt, das hat viele Eigenschaften und so..

Für TWindpark kannst du ja ein Array einrichten, in dem du die erzeugten TWindrad verwaltest -> Windpark1.WindradArray[7].Status:=offline; (das 8. Windrad vom Netz nehmen bei einem Array[0.. zum Beispiel).

Hübsches Projekt :-)

HebleBoy 
Fragesteller
 25.09.2017, 10:54

Danke für deine hilfreiche Antwort. Könntest du mir bitte noch kurz erklären was ein array macht, weil die zwei arrays die ich benutze, habe ich von einem Freund.

0
Hirnlos  11.10.2017, 00:16
@HebleBoy

Ein Array ist ein Feldtyp, der Name der Variable bleibt gleich. Statt einzelne Variablen zu definieren, zB Wert1, Wert2,.. nennst du die Variable einfach Wert und auf ihre Daten kommst du über den Index, also Wert[index] - wenn index selbst eine Variable ist... - aber ich nehme an, daß weißt du schon. Sonst hilft dir eine Suchmaschine deiner Wahl...
http://wiki.freepascal.org/Array/de

1
HebleBoy 
Fragesteller
 18.10.2017, 15:32
@Hirnlos

unit mWindparl1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;

type

{ TWindpark1 }

TWindpark1 = class(TForm)
ImWp1: TImage;
Timer1: TTimer;
procedure FormActivate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ImWp1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ImWp1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
Points:Array Of TPoint;
{ public declarations }
end;

var
Points:Array of TPoint;
Windpark1: TWindpark1;
XPos,YPos,Windraeder
:integer;

xarray,yarray,num:integer;

implementation

{$R *.lfm}

{ TWindpark1 }

procedure TWindpark1.FormActivate(Sender: TObject);
begin
Num:=0;
Windraeder:=0;
end;

procedure TWindpark1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
end;

procedure TWindpark1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

end;

procedure TWindpark1.ImWp1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
XPos:=Mouse.CursorPos.X;
YPos:=Mouse.CursorPos.Y;
SetLength(Points,Num+1);
Points[Num].X:=XPos;
Points[Num].Y:=YPos;
SetLength(Points,Num+1);
Num:=Num+1;
Windraeder:=Windrader+1;
Windpark1.Timer1.Enabled:=true;
end;

procedure TWindpark1.ImWp1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
With Windpark1.ImWp1 do
begin
Canvas.Line(XPos,YPos,XPos+30,YPos);
Canvas.Line(XPos,YPos,XPos+5,YPos-40);
Canvas.Line(XPos+30,YPos,XPos+25,YPos-40);
Canvas.Ellipse(XPos,YPos-60,XPos+30,YPos-30);
end;
end;

procedure TWindpark1.Timer1Timer(Sender: TObject);
var
i:integer;
begin
Windraeder:=Num;
With Windpark1.ImWp1.Canvas do
begin
//for i:=0 to Points.Length-1 do begin
//Line(Points[num].y,Points[num].y,Points[num].x+30,Points[num].y)
//end;
Repeat
Line((Points[Num].X),(Points[Num].Y),(Points[Num].X+30),(Points[Num].Y));
num:=Num-1;
until Num=-1 ;
end;
end;
end.

ich habe das Projekt nochmal neu angefangen. ich habe in der Zeile

Line((Points[Num].X),(Points[Num].Y),(Points[Num].X+30)

einen SIGSEGV und wollte fragen ob du mir helfen könntest, wenn ich reale Zahlen einsetze (1,2,3,4,5) dann funktioniert es.

0
Hirnlos  31.10.2017, 16:31
@HebleBoy

Du deklariert im TForm die Variable Points und dann nochmal im Bereich var.

...
public 
Points:Array Of TPoint; 
{ public declarations } 
end; 

var 
Points:Array of TPoint; 

Denke mir, daß es hier ein Problem geben könnte... benenne die Points bei var mal in gPoints um oder entferne die Deklaration.

0
Hirnlos  31.10.2017, 16:41
@HebleBoy

Im Timer1Timer zählst du mit der globalen Variable num herum. Klickst du dann mit der Maus erhöhst du sie um 1 (man kann auch inc(num); schreiben) und setzt die Größe deines Arrays auf den Wert von Num - alle Felder nach diesem Wert werden dann verworfen... Wenn Num also 1 ist und du auf 3 zugreifen willst, greifst du ins Leere und bekommst SIGSEGV.

Zähle also mit Num nicht rum, sondern deklariere im Timer1Timer eine lokale Variable i:integer; und mit der zählst du dann herum.

Alternativ nennst du die Num-Variable lieber CountOfPoints, dann weißt du besser, wozu sie da ist :-)

0
Hirnlos  31.10.2017, 16:45
@HebleBoy

Das war schon fast richtig:

for i:=0 to Points.Length-1 do begin 
 Line(Points[num].y,Points[num].y,Points[num].x+30,Points[num].y) 
end; 

Richtig wäre es so:

for i:=0 to Points.Length-1 do begin 
 Line(Points[i].y,Points[i].y,Points[i].x+30,Points[i].y) 
end; 

Nebenbei:
Anstelle von wert:=wert-1 kann man auch dec(wert) schreiben bzw inc(wert) zum hochzählen um 1.

0
HebleBoy 
Fragesteller
 25.09.2017, 11:22

Und wie setze ich den Fokus mit FormularName.setfocus

0
Hirnlos  11.10.2017, 00:21
@HebleBoy

Was ist der Focus?

Das ist das Objekt, das zB alle Tastatureingaben annimmt, wenn du tippst. Beispielsweise ein Edit-Feld.

Bei einem Formular ist es dann halt im Vordergrund, wenn es den Focus hat (falls nicht andere Fenster weiter "vorne" sind oder die Eigenschaften das Formular einschränken).

Wenn du ein Editfeld hast und ihm den Fokus setzst, dann blinkt der Eingabebalken darin...

0