Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu Memo-Funktionsweise (https://www.delphipraxis.net/38282-frage-zu-memo-funktionsweise.html)

fragme 17. Jan 2005 06:39


Frage zu Memo-Funktionsweise
 
Hi,

kann mir einer sagen warum das hier nicht funktioniert:

Delphi-Quellcode:
procedure TForm1.EditAlarmChange(Sender: TObject);
var MemoText: String;
begin
  if StringGrid.Cells[0,1] = DateToStr(Date) then
  begin
    if StringGrid.Cells[1,1] = copy(LabelUhr.Caption,1,5) then
    begin
      Datei := StringGrid.Cells[2,1];
      MemoText := DateTimeToStr(Date + Time);
      Memo.Lines.Strings[MemoLine] := MemoText;
      MemoLine := MemoLine +1;
      if Datei <> '' then begin
        ShellExecute(Application.Handle, 'open', PChar(Datei), nil, nil, SW_NORMAL);
        MemoText := ' - ' + Datei + ' wird ausgeführt';
        Memo.Lines.Strings[MemoLine] := MemoText;
        MemoLine := MemoLine +1;
      end;
      Text := StringGrid.Cells[3,1];
      if Text <> '' then begin
        showmessage(Text);
        MemoText := ' - ' + Text + ' angezeigt';
        Memo.Lines.Strings[MemoLine] := MemoText;
        MemoLine := MemoLine +1;
      end;
    end;
  end;
end;
Das Ergebnis sieht so aus:

17.01.2005 07:38:00
- F:\- Eigene Dateien -\Delphi\Taskplaner\Nero.exe wird ausgeführt

THX
fragme

fragme 17. Jan 2005 07:23

Re: Frage zu Memo-Funktionsweise
 
Was stattdessen passiert ist, dass Form1.Caption auf den Inhalt von Text gesetzt wird, obwohl ich nirgends eine Zuweisung dafür im Programm hab.

fragme 17. Jan 2005 08:33

Re: Frage zu Memo-Funktionsweise
 
und beim Weiterprggen stellt sich gleich noch eine Frage :mrgreen:

Beim Rechtsklick auf StringGrid soll ein PopUp Menü erscheinen, in dem man Zeile löschen auswählen kann, soweit ganz einfach, aber wie kann ich rausfinden, in welcher Zeile der Click stattgefunden hat?

Muetze1 17. Jan 2005 08:47

Re: Frage zu Memo-Funktionsweise
 
Moin!

Erstmal: Schon 23 und immernoch nicht den Edit Button gefunden um seine Beiträge zu editieren?
Und dann noch: Mehrere Fragen: mehrere Threads!

Zitat:

Zitat von fragme
Was stattdessen passiert ist, dass Form1.Caption auf den Inhalt von Text gesetzt wird, obwohl ich nirgends eine Zuweisung dafür im Programm hab.

TForm.Text = TForm.Caption - Daher ist es völlig normal, das deine Caption des Forms den Inhalt von Text bekommt - schon alleine sollte sich für dich die Frage stellen wo du denn Text definiert hast - und ich hoffe doch jetzt nicht das hier eine globale oder Unit-globale Deklaration von einer Stringvariable gepostet wird...

Zitat:

Zitat von fragme
Beim Rechtsklick auf StringGrid soll ein PopUp Menü erscheinen, in dem man Zeile löschen auswählen kann, soweit ganz einfach, aber wie kann ich rausfinden, in welcher Zeile der Click stattgefunden hat?

Nutze das MouseUp Ereignis und frage anhand der übergebenen X, Y Koordinate das StringGrid welche Zelle darunter liegt (CellAt(), o.ä.). Dieser Weg ist einer von vielen - ich denke mal da gibt es noch andere, bessere Möglichkeiten.

MfG
Muetze1

fragme 17. Jan 2005 09:00

Re: Frage zu Memo-Funktionsweise
 
ok, werd ich mir merken fürs nächste mal :)

Text ist eine globale Variable, das ist soweit richtig, aber ich hatte das selbe Problem, als ich das Memo mit '----------' initialisiert hab und das ändern der Variable 'Text' hat auch nicht geholfen.

kann es auch an dem '-' liegen ?

Muetze1 17. Jan 2005 13:57

Re: Frage zu Memo-Funktionsweise
 
Moin!

Zitat:

Zitat von fragme
Text ist eine globale Variable, ...

Hatte ich nicht gesagt, das ich sowas nicht hören wollte?

Also, deine Methode ist eine Methode von TForm1 und somit haben da die Eigenschaften und Variablen der TForm1 einen höheren Rang und liegen im Fokus. Wenn du nun aber eine globale Variable hast, dann schaut der Compiler diese nicht mal mit seinem Hintern an, da er als erstes in dem aktuellen Fokus nachschaut (also TForm1) und da schon eine Eigenschaft "Text" findet und daher diese nutzt. Das hatte ich dir vorhin schon geschrieben. Also hoffe ich mal das du jetzt verstehst woran es liegt.

Ansonsten frage ich mich, warum heutzutage für sowas noch globale Variablen benutzt werden. Warum global? Warum nicht private oder wenn es sein muss auch public, aber warum global? Warum nur?

MfG
Muetze1

fragme 17. Jan 2005 15:29

Re: Frage zu Memo-Funktionsweise
 
aha, ich hoffe ich hab verstanden was du meinst.

Also müsste es nach deiner Aussage reichen die Variable als private oder public zu deklarieren ?

Muetze1 18. Jan 2005 00:21

Re: Frage zu Memo-Funktionsweise
 
Moin!

Zitat:

Zitat von fragme
aha, ich hoffe ich hab verstanden was du meinst.

Also müsste es nach deiner Aussage reichen die Variable als private oder public zu deklarieren ?

Ja, das wäre noch die beste Lösund - ich würde dir aber vorschlagen sie umzubenennen, damit du keine Doppeldeutigkeit mehr hast. Schliesslich erbt die TForm1 schon von TForm die Eigenschaft Text, daher solltest du dein Variable anders nennen. Mal ganz abgesehen davon: wofür brauchst du die Variable überhaupt ausserhalb der Funktion? Sollte es nicht einfach nur reichen diese Variable in der Funktion/Procedure als lokale Variable zu definieren?

Ansonsten könntest du auch die globale Variable umbennen - aber wie gesagt: lieber ins private bewegen und anders nennen.

Ich für meinen Teil habe folgende Bennungen:

-> alle lokalen Variablen in Funktionen/Proceduren bekommen ein kleines l vor der sonst ungarischen Notation (z.B: lElement : TElement) --- hierbei gilt diese Regel nicht für Zählvariablen bzw. Laufvariablen bestehend aus einem Zeichen (z.B.: Var i : Integer)
-> alle Variablen innerhalb von Klassen (nicht public/published) bekommen ein kleines f vor der sonst ungarischen Notation (z.B. fLibrary : TLibrary;)
-> alle Ereignismethodenvariablen bekommen ein grosses F vor der sonst ungarischen Notation (z.B. FOnChange : TNotifyEvent;)
-> alle Elemente die Public sind bzw. Property-Namen sind direkt in ungarischer Notation ohne Prefix (z.B. Property OnChange : TNotifyEvent Read FOnChange Write FOnChange;)
-> alle Konstanten bekommen ein kleines co vor der sonst ungarischen Notation (z.B: Const coElemDiff = 4;)
-> alle globalen Variablen (sehr selten) bekommen ein kleines g vor der ungarischen Notation (z.B: Var gElemHandle : THandle;)

Aber über Schreibweisen lässt sich eh stundenlang streiten, aber der Grund dafür das ich dies hier mal darlege liegt einfach darin, dass ich mit diesen Regeln keine solche Probleme wie du sie jetzt hast haben kann. Ich habe immer "f" vor Variablen der Klassen, immer ein "g" vor globalen Variablen und ein "l" vor lokalen Variablen, daher passiert es mir eigentlich nicht das ich eine Variable oder andere Property ausversehen anspreche...

MfG
Muetze1

Hansa 18. Jan 2005 00:49

Re: Frage zu Memo-Funktionsweise
 
Habe schon katastrophalere Source-Codes gesehen. 8)

Zitat:

Zitat von fragme
Memo.Lines.Strings[MemoLine] := MemoText;
MemoLine := MemoLine +1;

Was ist Memoline ?

Eine neue Zeile erzeugst du nämlich mit:

Delphi-Quellcode:
Memo.Lines.Add ('neue Zeile');
Was soll das Memo machen und was das Stringgrid ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz